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);
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