Json数据的序列化与反序列化的三种常用方法介绍

以下内容是本作者从官网中看相应的教程后所做的demo,其体现了作者对相关知识点的个人理解。。作者才疏学浅,难免会有理解不到位的地方。。还请各位读者批判性对待。。。

本文主要介绍在Json数据的序列化与反序列化的过程中我经常用到的三种工具的基本使用方法,及其他们之间

的比较。。。希望能够对读者们有一些帮助。。。

这里介绍到的三种解析与生成Json数据的方法分别是:标准JSON解析与生成方法、使用gson解析与生成JSON数据

、使用fastJsson解析与生成JSON数据。

首先,这些工具都可以到相应的官网中下载。以下给出我所用到的jar包的下载链接:

1)标准JSON所用到的jar包:http://download.csdn.net/detail/caihongshijie6/6701285

2)gson所用到的jar包:http://download.csdn.net/detail/caihongshijie6/7260481

3)fastjson所用到的jar包:http://download.csdn.net/detail/caihongshijie6/7260485

一、对于JSON数据的描述

JSON是一种轻量级的数据交换格式(个人认为在很多方面上,其优于XML)。我个人将其数据形式总结如下:

{}表示一个对象,以  键:值  对的形式给出对象的内部成员及成员变量的值。多个内部成员之间用 逗号,来隔开。

集合和数组都用[]来表示。

更详尽的关于JSON的描述请参考其官网:http://www.json.org/   (里面也有各种各样的解析工具)

二、使用标准JSON的解析与生成方法

1、首先写一个我们会用到的pojo类

public class Person {

	private int id;
	private String name;
	private String address;

	public Person() {

	}

	public Person(int id, String name, String address) {
		super();
		this.id = id;
		this.name = name;
		this.address = address;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", address=" + address
				+ "]";
	}

}

2、使用标准JSON进行生成与解析

package com.njupt.pojo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class Main {

	public static void main(String[] args) {

		/**
		 * 生成JSON字符串
		 *
		 */
		//对象
		Person person = new Person(1, "haungjundong","beijing");
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("hjd", person);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");

		//基本数据类型
		jsonObject.put("int", 123);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");

		jsonObject.put("string", "hello world");
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");

		//数组
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		jsonObject.put("arr", arr);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");

		/**
		 * 生成集合类型数据(1)
		 * 为什么不使用List<基本类型>来距离呢???
		 * 因为"基本类型的集合"已经有一种形式来表示了:-------->数组
		 * 如果一定要的话,轻易List<Integer>,然后做一个demo
		 */
		List<String> strList = new ArrayList<String>();
		for(int i = 0 ; i < 10 ; ++i){
			strList.add("str" + i);
		}
		jsonObject.put("strList", strList);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");

		//生成集合类型数据(2)
		List<Person> personList = new ArrayList<Person>();
		for(int i = 0 ; i < 10 ; ++i){
			personList.add(new Person(i, "hjd" + i, "beijing" + i));
		}
		jsonObject.put("personList", personList);
//		System.out.println("--------------");
//		System.out.println(jsonObject.toString());
//		System.out.println("--------------");

		/**
		 * 生成集合类型数据(3)
		 *
		 * 1)
		 * Caused by: java.lang.ClassCastException:
		 * JSON keys must be strings.------->JSON对象中的key必须是一个String类型的(字符串)
		 *
		 * 2)对于下面,可以这样理解(可能有一点不太准确,但是方便理解)
		 * map是一个对象,key为其内部成员,value是key的值
		 */
		List<Map> mapList = new ArrayList<Map>();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap<String, Integer>();
			map.put("" + i, 10+i);

			mapList.add(map);
		}
		jsonObject.put("mapList", mapList);
		System.out.println("--------------");
		System.out.println(jsonObject.toString());
		System.out.println("--------------");

		System.out.println("------------------->解析json字符串");
		String jsonString = jsonObject.toString();//将jsonObject转换成json字符串

		JSONObject jsonObject2 = JSONObject.fromObject(jsonString);//利用json字符串生成json对象

		//解析Person对象
		Person person2 = new Person();

//		JSONObject personObject = (Person) jsonObject2.get("hjd");//*****这种写法是错的,原生的json的解析方法并不支持将json字符串自动转成相应的对象...
		JSONObject personObject = (JSONObject) jsonObject2.get("hjd");//第一种写法
//		JSONObject personObject = jsonObject2.getJSONObject("hjd");//第二种写法
		person2.setId(personObject.getInt("id"));
		person2.setName(personObject.getString("name"));
		person2.setAddress(personObject.getString("address"));
		System.out.println("--------------->person2: " + person2);

//		System.out.println("person2.getId(): " + person2.getId() + ",person2.getAddress(): " + person2.getAddress() + ",person2.getName()" + person2.getName());

		//解析基本数据类型
		int num = jsonObject2.getInt("int");
//		System.out.println("---->num: " + num);

		//解析基本类型的数组数组
		JSONArray arrArray = jsonObject2.getJSONArray("arr");
		int size = arrArray.size();
		int arr2[] = new int[size];
		for(int i = 0 ; i < size ; ++i){
			arr2[i] = arrArray.getInt(i);
		}
//		System.out.println(Arrays.toString(arr2));

		//解析List<String>
		JSONArray strArray = jsonObject2.getJSONArray("strList");
		List<String> strList2 = new ArrayList<String>();
		int size2 = strArray.size();
		for(int i = 0 ; i < size2 ; ++i){
			strList2.add(strArray.getString(i));
		}
//		System.out.println("---------->" + strList2);

		//解析List<Person>
		JSONArray personArray = jsonObject2.getJSONArray("personList");
		List<Person> personList2 = new ArrayList<Person>();
		int size3 = personArray.size();
		for(int i = 0 ; i< size3 ; ++i){
			JSONObject jObject = personArray.getJSONObject(i);
			Person p = new Person();

			p.setId(jObject.getInt("id"));
			p.setName(jObject.getString("name"));
			p.setAddress(jObject.getString("address"));

			personList2.add(p);
		}

//		System.out.println("----------->" + personList2);

		//解析List<Map>
		JSONArray mapArray = jsonObject2.getJSONArray("mapList");
		List<Map> mapList2 = new ArrayList<Map>();
		int size4 = mapArray.size();
		for(int i = 0 ; i < size4 ; ++i){
			JSONObject jo = mapArray.getJSONObject(i);
			Map m = new HashMap<String, Integer>();
			m.put("" + i, jo.getInt("" + i));

			mapList2.add(m);
		}
		System.out.println("--------------->" + mapList2);
	}
}

小结一下:使用标准JSON进行解析时,主要用到的API如下:

生成:

Person person = new Person(1, "haungjundong","beijing");
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("hjd", person);

解析时:举例如下

[]:jsonObject2.getJSONArray("arr");

{}:jsonObject2.getJSONObject("hjd");

基本数据类型:jsonObject2.getInt("int");

jsonObject.toString() ---->>将json对象转换成json格式的字符串

JSONObject jsonObject2 = JSONObject.fromObject(jsonString); -------->>利用json字符串生成json对象

二、使用gson进行生成与解析

1、Person类的代码同上

2、使用gson进行生成与解析

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;

public class Main {

	public static void main(String[] args) {

		/**
		 * 使用gson来生成JSON字符串
		 */
		//对象
		Person person = new Person(1, "haungjundong","beijing");

		Gson gson = new Gson();
		String personStr = gson.toJson(person);
//		System.out.println( "----------->" + personStr);

		Person person2 = gson.fromJson(personStr, Person.class);
//		System.out.println("------>person2: " + person2);

		//数组
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		String arrStr = gson.toJson(arr);
//		System.out.println(arrStr);

		int arr2[] = gson.fromJson(arrStr,int[].class);//****这是要注意的地方之一..
//	    System.out.println(Arrays.toString(arr2));

		/**
		 * 生成集合类型数据(1)
		 *
		 * 无论是List<String>还是List<Person>还是List<Map>
		 * 其利用json字符串生成对象的时候,其类型都是List.class
		 */
		List<String> strList = new ArrayList<String>();
		for(int i = 0 ; i < 10 ; ++i){
			strList.add("str" + i);
		}
		String strListStr = gson.toJson(strList);
//		System.out.println("----------->" + strListStr);

		List<String> strList2 = gson.fromJson(strListStr, List.class);
//		System.out.println(strList2);

		//生成集合类型数据(2)
		List<Person> personList = new ArrayList<Person>();
		for(int i = 0 ; i < 10 ; ++i){
			personList.add(new Person(i, "hjd" + i, "beijing" + i));
		}
		String personListJsonStr = gson.toJson(personList);
//		System.out.println(personListJsonStr);

		List<Person> personList2 = gson.fromJson(personListJsonStr, List.class);
		/**
		 * [{id=0.0, name=hjd0, address=beijing0}, {id=1.0, name=hjd1, address=beijing1}, {id=2.0, name=hjd2, address=beijing2}, {id=3.0, name=hjd3, address=beijing3}, {id=4.0, name=hjd4, address=beijing4}, {id=5.0, name=hjd5, address=beijing5}, {id=6.0, name=hjd6, address=beijing6}, {id=7.0, name=hjd7, address=beijing7}, {id=8.0, name=hjd8, address=beijing8}, {id=9.0, name=hjd9, address=beijing9}]
		 */
//		System.out.println(personList2);

		/**
		 * 生成集合类型数据(3)
		 *
		 * 1)
		 * Caused by: java.lang.ClassCastException:
		 * JSON keys must be strings.------->JSON对象中的key必须是一个String类型的(字符串)
		 *
		 * 2)对于下面,可以这样理解(可能有一点不太准确,但是方便理解)
		 * map是一个对象,key为其内部成员,value是key的值
		 */
		List<Map> mapList = new ArrayList<Map>();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap<String, Integer>();
			map.put("" + i, 10+i);

			mapList.add(map);
		}
		String mapListJsonStr = gson.toJson(mapList);
//		System.out.println(mapListJsonStr);

		List<Map> mapList2 = gson.fromJson(mapListJsonStr, List.class);
//		System.out.println(mapList2);
	}
}

小结:

1)生成JSON数据:举例

Gson gson = new Gson();
String personStr = gson.toJson(person);

2)解析JSON数据:举例

Person person2 = gson.fromJson(personStr, Person.class);

Person person2 = gson.fromJson(personStr, Person.class);

特别需要注意的是:

基本类型数据的解析方式: int[].class

List类型数据的解析方式: List.class  (无论是List<String>还是List<Map>还是,List<Person>都是用的是这个)

其实大家可以发现,我们在生成与解析的时候只是调一下gson这个对象的方法而已。除此之外,专门生成一个

gson对象似乎没有什么用。。。

是的,我是这么认为的。我想阿里巴巴的那帮哥们也是这么想的。所以在对性能进行进一步优化的同时,他们

把解析的方法对做成静态的了。。。这样就不需要专门生成一个对象才能使用相应的方法

三、使用fastjson进行生成与解析

1、Person类的代码是一样的

2、

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;

public class Main {

	public static void main(String[] args) {

		/**
		 * 使用gson来生成JSON字符串
		 */
		//对象
		Person person = new Person(1, "haungjundong","beijing");
		String personStr = JSON.toJSONString(person);//利用对象生成JSON字符串
//		System.out.println(personStr);
		Person person2 = JSON.parseObject(personStr, Person.class);//利用JSON字符串生成Person对象
//		System.out.println(person2);

		//数组
		int arr[] = new int[10];
		for(int i = 0 ; i < 10 ; ++i){
			arr[i] = i;
		}
		String arrStr = JSON.toJSONString(arr);
//		System.out.println(arrStr);
		int arr2[] = JSON.parseObject(arrStr, int[].class);
//		System.out.println(Arrays.toString(arr2));

		/**
		 * 生成集合类型数据(1)
		 *
		 * 无论是List<String>还是List<Person>还是List<Map>
		 * 其利用json字符串生成对象的时候,其类型都是List.class
		 */
		List<String> strList = new ArrayList<String>();
		for(int i = 0 ; i < 10 ; ++i){
			strList.add("str" + i);
		}
		String strListJSONStr = JSON.toJSONString(strList);
//		System.out.println(strListJSONStr);
		List<String> strList2 = JSON.parseObject(strListJSONStr, List.class);
//		System.out.println(strList2);

		//生成集合类型数据(2)
		List<Person> personList = new ArrayList<Person>();
		for(int i = 0 ; i < 10 ; ++i){
			personList.add(new Person(i, "hjd" + i, "beijing" + i));
		}
		String personListJSONStr = JSON.toJSONString(personList);
		/**
		 * 以下语句的打印结果
		 * [{"address":"beijing0","id":0,"name":"hjd0"},{"address":"beijing1","id":1,"name":"hjd1"},{"address":"beijing2","id":2,"name":"hjd2"},{"address":"beijing3","id":3,"name":"hjd3"},{"address":"beijing4","id":4,"name":"hjd4"},{"address":"beijing5","id":5,"name":"hjd5"},{"address":"beijing6","id":6,"name":"hjd6"},{"address":"beijing7","id":7,"name":"hjd7"},{"address":"beijing8","id":8,"name":"hjd8"},{"address":"beijing9","id":9,"name":"hjd9"}]
		 */
//		System.out.println(personListJSONStr);
		List<Person> personList2 = JSON.parseObject(personListJSONStr, List.class);
		/**
		 * 以下语句的打印结果
		 * [Person [id=0, name=hjd0, address=beijing0], Person [id=1, name=hjd1, address=beijing1], Person [id=2, name=hjd2, address=beijing2], Person [id=3, name=hjd3, address=beijing3], Person [id=4, name=hjd4, address=beijing4], Person [id=5, name=hjd5, address=beijing5], Person [id=6, name=hjd6, address=beijing6], Person [id=7, name=hjd7, address=beijing7], Person [id=8, name=hjd8, address=beijing8], Person [id=9, name=hjd9, address=beijing9]]
		 */
//		System.out.println(personList);

		/**
		 * 生成集合类型数据(3)
		 *
		 * 1)
		 * Caused by: java.lang.ClassCastException:
		 * JSON keys must be strings.------->JSON对象中的key必须是一个String类型的(字符串)
		 *
		 * 2)对于下面,可以这样理解(可能有一点不太准确,但是方便理解)
		 * map是一个对象,key为其内部成员,value是key的值
		 */
		List<Map> mapList = new ArrayList<Map>();
		for(int i = 0 ; i < 10 ; ++i){
			Map map = new HashMap<String, Integer>();
			map.put("" + i, 10+i);

			mapList.add(map);
		}
		String mapListJSONStr = JSON.toJSONString(mapList);
//		System.out.println(mapListJSONStr);
		List<Map> mapList2 = JSON.parseObject(mapListJSONStr, List.class);
//		System.out.println(mapList2);

	}
}

小结:

1)生成JSON格式的数据

JSON.toJSONString(person);//利用对象生成JSON字符串

2)解析JSON格式的数据

JSON.parseObject(arrStr, int[].class);

注意:

fastjson与gson的使用方式很像。但是在一些细节方面上还是用有区别的。这些细节上的差别在服务器与客户端的数据进行交互的时候可能产生的影响是很大的。还请各位读者认真思考在使用。个人比较倾向于使用fastjson,个人认为他在一些细节方面处理得要比google的gson处理得好。。。

四、三者之间的比较

标准JSON的生成与解析方法与gson、fastjson之间最大的区别就在于:标准JSON的生成与解析方法无法利用JSON

数据自动生成相应的对象和数据。使用标准JSON进行生成相应的对象时,只能是一个一个的获取器成员变量的数据,然后一个一个地set()。。

五、写在最后

更多的只是还请各位读者到相应的官网去查找相应的教程。。如果有错误还请多多包涵并且批评指出(不要吐槽的太厉害哈~~~~)

六、源码下载

http://download.csdn.net/detail/caihongshijie6/7260637

Json数据的序列化与反序列化的三种常用方法介绍,码迷,mamicode.com

时间: 2024-10-22 03:47:07

Json数据的序列化与反序列化的三种常用方法介绍的相关文章

C# 编写通用的JSON数据进行序列化和反序列化

注意事项:使用JSON系列化和反系列化,必须要添加引用System.Runtime.Serialization. 1.通用类代码如下: /// <summary>    /// JSON序列化和反序列化辅助类    /// </summary>    public class JsonHelper    {        /// <summary>        /// JSON序列化        /// </summary>        /// <

fastjson生成和解析json数据,序列化和反序列化数据

本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>) 2.通过一个android程序测试fastjson的用法. fastjson简介: Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jack

利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScriptSerializer进行JSON序列化 注意:    是复杂对象. JSON是Javascript中常用的数据格

UDP畅聊系统数据的序列化与反序列化

comm中实现基本数据的序列化与反序列化 基于jsoncpp库,由c++编写,用于为网络数据提供序列化及反序列化功能 使用的几个类 Json::Value 可表示所有的类型,int,float,string等 Json::Reader 将json字符串解析到Value中,反序列化,使用Parse函数 Json::Writer 将Value转换成json字符串型,序列化 它的两个子类:Json::FastWriter 和Json::StyledWriter 两种不同的显示风格 Makefile  

MVC JSON JavaScriptSerializer 进行序列化或反序列化时出错

MVC control中返回json格式数据一般都是如下格式 [HttpPost] public ActionResult CaseAudit(string name) { var data ="dasda": return Json(data); } 但是这样如果字符串长度太大会报错 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值 按下面方法可以解决 [HttpPost] public A

JSON数据的序列化方法

ajax传参是json数据对象时,最好是将json对象先序列化 var stuAnswerTotal = examModule.touch.getData('examAnswer'); console.log(stuAnswerTotal);//Object对象如下 { 17072={ "id" : 1702, "type":"1",                "val":["",'"&quo

利用 进行Json对象的序列化和反序列化 - RJ - 博客园

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 - RJ - 博客园 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 进行Json对象的序列化和反序列化 - RJ - 博客园,bubuko.com" href="http://www.bubuko.com/infodetail-217182.html" target=_blank>利用 进行Json对象的序列化和反序列

.net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, string whereClause) { string str=""; return Json(str); } 此时如果str过长,就会报“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

js实现对json数据的序列化(兼容ie6以上浏览器)

/** * 增加对JSON数据的序列化方法, * 主要用于IE6.7不支持JSON对象的浏览器 */ var xue = xue || {};xue.json = xue.json || {}; xue.json.stringify = function(obj) {    //如果是IE8+ 浏览器(ff,chrome,safari都支持JSON对象),使用JSON.stringify()来序列化    if (window.JSON) {        return JSON.stringi