各个JSON技术的比较
- json-lib
最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,
包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,
对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。
json-lib在功能和性能上面都不能满足现在互联网化的需求。
//创建一个javabean
public class Item {
private String name;
private int size;
private String type;
//getter and setter
public Item(){}
public Item(String name, int size, String type) {
this.name = name;
this.size = size;
this.type = type;
}
@Override
public String toString() {
return "Item{" +
"name='" + name + '\'' +
", size=" + size +
", type='" + type + '\'' +
'}';
}
}
//核心代码
public static void main(String[] args) {
Item item1 = new Item("itemName1",21,"String");
Item item2 = new Item("itemName2",22,"Boolean");
Item item3 = new Item("itemName3",23,"Integer");
List<Item> list = new ArrayList<Item>();//构造一个List集合
list.add(item1);
list.add(item2);
list.add(item3);
Item[] items = {item1,item2,item3};//构造一个数组
Map<String,Item> map = new HashMap<String,Item>();//构造一个map集合
map.put(item1.getName(),item1);
map.put(item2.getName(),item2);
map.put(item3.getName(),item3);
//将Java数组转换成JSONArray
JSONArray jsonArray = JSONArray.fromObject(items);
System.out.println(jsonArray);
//将Java的List集合转换成JSONArray
jsonArray = JSONArray.fromObject(list);
System.out.println(jsonArray);
//将Java的Map集合转换成JSONObject
JSONObject jsonObject = JSONObject.fromMap(map);//(1)
System.out.println(jsonObject);
jsonObject = JSONObject.fromObject(map);//(2)
System.out.println(jsonObject);
//(1)(2)都可以
//将普通的JavaBean转换成JSONObject
jsonObject = JSONObject.fromObject(item1);
System.out.println(jsonObject);
//将JSONObject转换成JavaBean对象
Item item = (Item) JSONObject.toBean(jsonObject, Item.class);
System.out.println(item.toString());
//JSONObject的方法
String name = (String) jsonObject.get("name");//取得JavaBean的属性值
System.out.println(name);
//向json对象中添加JavaBean对象或者任意类型数据
JSONObject testObj1 = jsonObject.accumulate("test1", item1);
System.out.println(testObj1);
//向json对象中添加JavaBean对象或者任意类型数据
JSONObject testObj2 = jsonObject.put("test", item2);
System.out.println(testObj2);
}
//从Java对象(包括集合对象)到json对象均可使用fromObject()方法,唯一不同的是调用方法的对象不一致(map集合以外常用的集合使用JSONArray,map集合及简单JavaBea使用JSONObject)。
- 开源的Jackson
相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。
而且Jackson社区相对比较活跃,更新速度也比较快。
Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
- Google的Gson
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
- 阿里巴巴的FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
//Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。
public static final Object parse(Stringtext); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。
//SerializeWriter:相当于StringBuffer
//JSONArray:相当于List<Object>
//JSONObject:相当于Map<String, Object>
//JSON反序列化没有真正数组,本质类型都是List<Object>
一、json字符串的数据解析
1.json字符串 ---> JSONObject或者JSONArray【好处就是当你没有bean的model类时,可以直接获取相关数据】
Object parse(String text)【这是下面2个方法的合集,是大招!】
JSONObject parseObject(String text)
JSONArray parseArray(String text)
2.json字符串 ---> bean对象【好处是如果你有model,你可以解析为java对象然后继续操作】
T parseObject(String text, Class clazz) //一个bean对象的解析生成
List parseArray(String text, Class clazz) //多个bean对象的解析生成
二、java对象的json格式化
1.bean对象转json字符串
String toJSONString(Object object)
String toJSONString(Object object, boolean prettyFormat)
2.java对象转换为JSONObject或者JSONArray【是大招,单个bean对象能转,list集合也能转】,有了这一步,再来个toString就ok了。
Object toJSON(Object javaObject);