以下内容是本作者从官网中看相应的教程后所做的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) { Person person = new Person(1, "haungjundong","beijing"); JSONObject jsonObject = new JSONObject(); jsonObject.put("hjd", person); jsonObject.put("int", 123); jsonObject.put("string", "hello world"); int arr[] = new int[10]; for(int i = 0 ; i < 10 ; ++i){ arr[i] = i; } jsonObject.put("arr", arr); List<String> strList = new ArrayList<String>(); for(int i = 0 ; i < 10 ; ++i){ strList.add("str" + i); } jsonObject.put("strList", strList); 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); 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 jsonObject2 = JSONObject.fromObject(jsonString); Person person2 = new Person(); JSONObject personObject = (JSONObject) jsonObject2.get("hjd"); person2.setId(personObject.getInt("id")); person2.setName(personObject.getString("name")); person2.setAddress(personObject.getString("address")); System.out.println("--------------->person2: " + person2); int num = jsonObject2.getInt("int"); 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); } 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)); } 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); } 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) { Person person = new Person(1, "haungjundong","beijing"); Gson gson = new Gson(); String personStr = gson.toJson(person); Person person2 = gson.fromJson(personStr, Person.class); int arr[] = new int[10]; for(int i = 0 ; i < 10 ; ++i){ arr[i] = i; } String arrStr = gson.toJson(arr); int arr2[] = gson.fromJson(arrStr,int[].class); List<String> strList = new ArrayList<String>(); for(int i = 0 ; i < 10 ; ++i){ strList.add("str" + i); } String strListStr = gson.toJson(strList); List<String> strList2 = gson.fromJson(strListStr, List.class); 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); List<Person> personList2 = gson.fromJson(personListJsonStr, List.class); 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); List<Map> mapList2 = gson.fromJson(mapListJsonStr, List.class); }}
小结:
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进行生成与解析、
特别提醒:使用fastjson将json字符串转成List<javabean>对象时,尽量使用以下方式
List<Person> persons2 = JSON.parseArray(jsonString,Person.class);
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) { Person person = new Person(1, "haungjundong","beijing"); String personStr = JSON.toJSONString(person); Person person2 = JSON.parseObject(personStr, Person.class); int arr[] = new int[10]; for(int i = 0 ; i < 10 ; ++i){ arr[i] = i; } String arrStr = JSON.toJSONString(arr); int arr2[] = JSON.parseObject(arrStr, int[].class); List<String> strList = new ArrayList<String>(); for(int i = 0 ; i < 10 ; ++i){ strList.add("str" + i); } String strListJSONStr = JSON.toJSONString(strList); List<String> strList2 = JSON.parseObject(strListJSONStr, List.class); 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); List<Person> personList2 = JSON.parseObject(personListJSONStr, List.class); 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); List<Map> mapList2 = JSON.parseObject(mapListJSONStr, List.class); }}
小结:
1)生成JSON格式的数据
JSON.toJSONString(person);
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