各個(gè)JSON技術(shù)的比較
- json-lib
最開(kāi)始的也是應(yīng)用最廣泛的json解析工具,json-lib 不好的地方確實(shí)是依賴于很多第三方包,
包括commons-beanutils.jar杠输,commons-collections-3.2.jar,commons-lang-2.6.jar憨攒,commons-logging-1.1.1.jar冈敛,ezmorph-1.0.6.jar,
對(duì)于復(fù)雜類(lèi)型的轉(zhuǎn)換絮记,json-lib對(duì)于json轉(zhuǎn)換成bean還有缺陷摔踱,比如一個(gè)類(lèi)里面會(huì)出現(xiàn)另一個(gè)類(lèi)的list或者map集合,json-lib從json到bean的轉(zhuǎn)換就會(huì)出現(xiàn)問(wèn)題怨愤。
json-lib在功能和性能上面都不能滿足現(xiàn)在互聯(lián)網(wǎng)化的需求派敷。
//創(chuàng)建一個(gè)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>();//構(gòu)造一個(gè)List集合
list.add(item1);
list.add(item2);
list.add(item3);
Item[] items = {item1,item2,item3};//構(gòu)造一個(gè)數(shù)組
Map<String,Item> map = new HashMap<String,Item>();//構(gòu)造一個(gè)map集合
map.put(item1.getName(),item1);
map.put(item2.getName(),item2);
map.put(item3.getName(),item3);
//將Java數(shù)組轉(zhuǎn)換成JSONArray
JSONArray jsonArray = JSONArray.fromObject(items);
System.out.println(jsonArray);
//將Java的List集合轉(zhuǎn)換成JSONArray
jsonArray = JSONArray.fromObject(list);
System.out.println(jsonArray);
//將Java的Map集合轉(zhuǎn)換成JSONObject
JSONObject jsonObject = JSONObject.fromMap(map);//(1)
System.out.println(jsonObject);
jsonObject = JSONObject.fromObject(map);//(2)
System.out.println(jsonObject);
//(1)(2)都可以
//將普通的JavaBean轉(zhuǎn)換成JSONObject
jsonObject = JSONObject.fromObject(item1);
System.out.println(jsonObject);
//將JSONObject轉(zhuǎn)換成JavaBean對(duì)象
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對(duì)象中添加JavaBean對(duì)象或者任意類(lèi)型數(shù)據(jù)
JSONObject testObj1 = jsonObject.accumulate("test1", item1);
System.out.println(testObj1);
//向json對(duì)象中添加JavaBean對(duì)象或者任意類(lèi)型數(shù)據(jù)
JSONObject testObj2 = jsonObject.put("test", item2);
System.out.println(testObj2);
}
//從Java對(duì)象(包括集合對(duì)象)到j(luò)son對(duì)象均可使用fromObject()方法,唯一不同的是調(diào)用方法的對(duì)象不一致(map集合以外常用的集合使用JSONArray撰洗,map集合及簡(jiǎn)單JavaBea使用JSONObject)篮愉。
- 開(kāi)源的Jackson
相比json-lib框架,Jackson所依賴的jar包較少差导,簡(jiǎn)單易用并且性能也要相對(duì)高些试躏。
而且Jackson社區(qū)相對(duì)比較活躍,更新速度也比較快设褐。
Jackson對(duì)于復(fù)雜類(lèi)型的json轉(zhuǎn)換bean會(huì)出現(xiàn)問(wèn)題颠蕴,一些集合Map泣刹,List的轉(zhuǎn)換出現(xiàn)問(wèn)題。
Jackson對(duì)于復(fù)雜類(lèi)型的bean轉(zhuǎn)換Json犀被,轉(zhuǎn)換的json格式不是標(biāo)準(zhǔn)的Json格式
- Google的Gson
Gson是目前功能最全的Json解析神器椅您,Gson當(dāng)初是為因應(yīng)Google公司內(nèi)部需求而由Google自行研發(fā)而來(lái),
但自從在2008年五月公開(kāi)發(fā)布第一版后已被許多公司或用戶應(yīng)用寡键。
Gson的應(yīng)用主要為toJson與fromJson兩個(gè)轉(zhuǎn)換函數(shù)掀泳,無(wú)依賴,不需要例外額外的jar昌腰,能夠直接跑在JDK上开伏。
而在使用這種對(duì)象轉(zhuǎn)換之前需先創(chuàng)建好對(duì)象的類(lèi)型以及其成員才能成功的將JSON字符串成功轉(zhuǎn)換成相對(duì)應(yīng)的對(duì)象。
類(lèi)里面只要有g(shù)et和set方法遭商,Gson完全可以將復(fù)雜類(lèi)型的json到bean或bean到j(luò)son的轉(zhuǎn)換固灵,是JSON解析的神器。
Gson在功能上面無(wú)可挑剔劫流,但是性能上面比FastJson有所差距巫玻。
- 阿里巴巴的FastJson
Fastjson是一個(gè)Java語(yǔ)言編寫(xiě)的高性能的JSON處理器,由阿里巴巴公司開(kāi)發(fā)。
無(wú)依賴祠汇,不需要例外額外的jar仍秤,能夠直接跑在JDK上。
FastJson在復(fù)雜類(lèi)型的Bean轉(zhuǎn)換Json上會(huì)出現(xiàn)一些問(wèn)題可很,可能會(huì)出現(xiàn)引用的類(lèi)型诗力,導(dǎo)致Json轉(zhuǎn)換出錯(cuò),需要制定引用我抠。
FastJson采用獨(dú)創(chuàng)的算法苇本,將parse的速度提升到極致,超過(guò)所有json庫(kù)菜拓。
//Fastjson API入口類(lèi)是com.alibaba.fastjson.JSON瓣窄,常用的序列化操作都可以在JSON類(lèi)上的靜態(tài)方法直接完成。
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轉(zhuǎn)換為JSONObject或者JSONArray俺夕。
//SerializeWriter:相當(dāng)于StringBuffer
//JSONArray:相當(dāng)于List<Object>
//JSONObject:相當(dāng)于Map<String, Object>
//JSON反序列化沒(méi)有真正數(shù)組,本質(zhì)類(lèi)型都是List<Object>
一贱鄙、json字符串的數(shù)據(jù)解析
1.json字符串 ---> JSONObject或者JSONArray【好處就是當(dāng)你沒(méi)有bean的model類(lèi)時(shí)劝贸,可以直接獲取相關(guān)數(shù)據(jù)】
Object parse(String text)【這是下面2個(gè)方法的合集,是大招逗宁!】
JSONObject parseObject(String text)
JSONArray parseArray(String text)
2.json字符串 ---> bean對(duì)象【好處是如果你有model映九,你可以解析為java對(duì)象然后繼續(xù)操作】
T parseObject(String text, Class clazz) //一個(gè)bean對(duì)象的解析生成
List parseArray(String text, Class clazz) //多個(gè)bean對(duì)象的解析生成
二、java對(duì)象的json格式化
1.bean對(duì)象轉(zhuǎn)json字符串
String toJSONString(Object object)
String toJSONString(Object object, boolean prettyFormat)
2.java對(duì)象轉(zhuǎn)換為JSONObject或者JSONArray【是大招疙剑,單個(gè)bean對(duì)象能轉(zhuǎn)氯迂,list集合也能轉(zhuǎn)】,有了這一步言缤,再來(lái)個(gè)toString就ok了嚼蚀。
Object toJSON(Object javaObject);