alibaba Fastjson是由阿里開(kāi)發(fā)用Java語(yǔ)言編寫(xiě)的高性能功能完善的JSON庫(kù)。它采用一種“假定有序快速匹配”的算法,把JSON Parse的性能提升到極致。
版本releases:
https://github.com/alibaba/fastjson/releases
特點(diǎn):
快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
強(qiáng)大(支持普通JDK類(lèi)包括任意Java Bean Class、Collection、Map、Date或enum)
零依賴(lài)(沒(méi)有依賴(lài)其它任何類(lèi)庫(kù)除了JDK)
常用序列化api:
//將Java對(duì)象序列化為JSON字符串
JSON.toJSONString(Object object, SerializerFeature... features);
//將Java對(duì)象序列化為JSON字符串,返回JSON字符串的utf-8 bytes
JSON.toJSONBytes(Object object, SerializerFeature... features);
//將Java對(duì)象序列化為JSON字符串,寫(xiě)入到Writer中
JSON.writeJSONString(Writer writer, Object object, SerializerFeature... features);
//將Java對(duì)象序列化為JSON字符串,按UTF-8編碼寫(xiě)入到OutputStream中
JSON.writeJSONString(OutputStream os, Object object, SerializerFeature... features);
常用反序列化API
// 將JSON字符串反序列化為JavaBean
JSON.parseObject(String jsonStr, Class<T> clazz, Feature... features);
// 將JSON字符串反序列化為泛型類(lèi)型的JavaBean
JSON.parseObject(String text, TypeReference<T> type, Feature... features);
//將JSON字符串反序列為JSONObject
JSON.parseObject(String text);
SerializerFeature屬性
| 屬性 | 備注 |
|---|---|
| QuoteFieldNames | 輸出key時(shí)是否使用雙引號(hào),默認(rèn)為true |
| UseSingleQuotes | 使用單引號(hào)而不是雙引號(hào),默認(rèn)為false |
| WriteMapNullValue | 是否輸出值為null的字段,默認(rèn)為false |
| WriteEnumUsingToString | Enum輸出name()或者original,默認(rèn)為false |
| UseISO8601DateFormat | Date使用ISO8601格式輸出,默認(rèn)為false |
| WriteNullListAsEmpty | List字段如果為null,輸出為[],而非null |
| WriteNullStringAsEmpty | 字符類(lèi)型字段如果為null,輸出為”“,而非null |
| WriteNullNumberAsZero | 數(shù)值字段如果為null,輸出為0,而非null |
| WriteNullBooleanAsFalse | Boolean字段如果為null,輸出為false,而非null |
| SkipTransientField | 如果是true,類(lèi)中的Get方法對(duì)應(yīng)的Field是transient,序列化時(shí)將會(huì)被忽略。默認(rèn)為true |
| SortField | 按字段名稱(chēng)排序后輸出,默認(rèn)為false |
| WriteTabAsSpecial | 把\t做轉(zhuǎn)義輸出,默認(rèn)為false 不推薦 |
JSONField配置方式
FieldInfo可以配置在getter/setter方法或者字段上。例如:
配置到getter/setter上
public class User {
private int id;
@JSONField(name="ID")
public int getId() {return id;}
@JSONField(name="ID")
public void setId(int value) {this.id = id;}
}
配置到屬性字段上
public class User {
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
指定字段是否序列化
@JSONField(serialize=false)
format配置日期格式化
// 配置date序列化和反序列使用yyyy-MM-dd日期格式
@JSONField(format="yyyy-MM-dd")
public Date date;
ordinal指定字段的順序
@JSONField(ordinal = 2)
JSONObject變成Map的問(wèn)題
1.2.55之后的版本,JSONObject.getJSONObject方法有變化,
新版本中如果發(fā)現(xiàn)get的值是Map類(lèi)型的話(huà),會(huì)return new JSONObject((Map)value); 本身JSONObject內(nèi)部就是用的Map來(lái)存儲(chǔ)數(shù)據(jù),到這一步其實(shí)也沒(méi)問(wèn)題,問(wèn)題在于程序在遍歷使用這個(gè)JSONObject的值時(shí)候,比如用JSONObject的values方法,返回的Collection 這個(gè)集合里面的Object在新版本中會(huì)是Map類(lèi)型的,這個(gè)時(shí)候如果強(qiáng)轉(zhuǎn)成JSONObject就會(huì)出錯(cuò),
以下代碼在1.2.45中正常,在1.2.74中會(huì)報(bào):java.util.HashMap cannot be cast to com.alibaba.fastjson.JSONObject
private static void testJSONObject(){
HashMap<String,HashMap<String,String>> map = new HashMap<String,HashMap<String,String>>();
HashMap<String,String> subMap = new HashMap<String, String>();
subMap.put("k1","v1");
map.put("subMap",subMap);
JSONObject json = new JSONObject();
json.put("map1",map);
JSONObject map1 = json.getJSONObject("map1");
for(Object obj:map1.values()){
System.out.println("值類(lèi)型:"+obj.getClass());
JSONObject subJson = (JSONObject)obj; //報(bào)錯(cuò)行
}
}
同樣在新版本中,JSONArray類(lèi)的getJSONArray和getJSONObject也有變化,getJSONArray發(fā)現(xiàn)值是List的話(huà),也會(huì)return JSONArray((List)value);
所以在使用的時(shí)候需要注意。