alibaba/fastjson

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í)候需要注意。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容