背景:最近工作中發現項目中大家使用的json工具類比較混亂,其中用的比較多的是google的Gson 和 阿里的FastJson,所以整理一下,記錄一下兩個json的區別,方便以后工作中更合理的使用。
1.Google的Gson
Gson是目前功能最全的Json解析神器,Gson當初是為因應Google公司內部需求而由Google自行研發而來,
但自從在2008年五月公開發布第一版后已被許多公司或用戶應用。
Gson的應用主要為toJson與fromJson兩個轉換函數,無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
而在使用這種對象轉換之前需先創建好對象的類型以及其成員才能成功的將JSON字符串成功轉換成相對應的對象。
類里面只要有get和set方法,Gson完全可以將復雜類型的json到bean或bean到json的轉換,是JSON解析的神器。
Gson在功能上面無可挑剔,但是性能上面比FastJson有所差距。
gson 相關設置:
GsonBuilder gsonBuilder = new GsonBuilder(); // 不導出實體類中沒有用@Expose注解的屬性 gsonBuilder.excludeFieldsWithoutExposeAnnotation(); // 支持Map的key為復雜對象的形式 gsonBuilder.enableComplexMapKeySerialization(); // 格式化date型 gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); // 會把字段首字母大寫,注:對於實體上使用了@SerializedName注解的不會生效. gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE); Gson gson = gsonBuilder.create(); // 屬性值為空時,也會有對應值 null gson.serializeNulls();
2.阿里巴巴的FastJson
Fastjson是一個Java語言編寫的高性能的JSON處理器,由阿里巴巴公司開發。
無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
FastJson在復雜類型的Bean轉換Json上會出現一些問題,可能會出現引用的類型,導致Json轉換出錯,需要制定引用。
FastJson采用獨創的算法,將parse的速度提升到極致,超過所有json庫。
SerializerFeature.PrettyFormat:格式化輸出 SerializerFeature.WriteMapNullValue:是否輸出值為null的字段,默認為false SerializerFeature.DisableCircularReferenceDetect:消除循環引用
SerializerFeature.WriteNullStringAsEmpty:將為null的字段值顯示為"" WriteNullListAsEmpty:List字段如果為null,輸出為[],而非null WriteNullNumberAsZero:數值字段如果為null,輸出為0,而非null WriteNullBooleanAsFalse:Boolean字段如果為null,輸出為false,而非null SkipTransientField:如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。默認為true SortField:按字段名稱排序后輸出。默認為false WriteDateUseDateFormat:全局修改日期格式,默認為false。 JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); BeanToArray:將對象轉為array輸出 QuoteFieldNames:輸出key時是否使用雙引號,默認為true UseSingleQuotes:輸出key時使用單引號而不是雙引號,默認為false(經測試,這里的key是指所有的輸出結果,而非key/value的key,而是key,和value都使用單引號或雙引號輸出) //先執行static代碼塊,再執行該方法(全局) //是否輸出值為null的字段,默認為false JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask(); //數值字段如果為null,輸出為0,而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullNumberAsZero.getMask(); //List字段如果為null,輸出為[],而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullListAsEmpty.getMask(); //字符類型字段如果為null,輸出為 "",而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullStringAsEmpty.getMask() // 使用時傳遞參數 JSONObject.toJSONString(map, SerializerFeature.WriteMapNullValue,SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteDateUseDateFormat);
源碼:
public static String toJSONString(Object object, int defaultFeatures, SerializerFeature... features) { SerializeWriter out = new SerializeWriter((Writer) null, defaultFeatures, features); try { JSONSerializer serializer = new JSONSerializer(out); serializer.write(object); return out.toString(); } finally { out.close(); } }
代碼中這個可以傳遞多個定制化設置,具體的設置參數在 com.alibaba.fastjson.serializer.SerializerFeature 類中
也可以在實體類中配合 @JSONField 字段使用