Java對象在轉(zhuǎn)json的時候,如果對象里面有屬性值為null的處理
一府适、fastJson
1羔飞、fastJson在轉(zhuǎn)換java對象為json的時候,默認是不序列化null值對應的key的
也就是說當對象里面的屬性為空的時候檐春,在轉(zhuǎn)換成json時逻淌,不序列化那些為null值的屬性
具體案例如下:
AutoPartsSearchRequest 有以下屬性:
1. public static void main(String[] args) {
2. AutoPartsSearchRequest request = new AutoPartsSearchRequest();
3. request.setKeywords("123");
4. request.setSortingField("234242");
5. String str = JSONObject.toJSONString(request);//fastjson默認轉(zhuǎn)換是不序列化null值對應的key的
6. System.out.println(str);
7. }
輸出結(jié)果:{"keywords":"123","sortingField":"234242"} , 沒有序列化那些值為null的屬性
2疟暖、但是如果想把null對應的key序列化出來呢卡儒?
那就要仔細看看fastjson轉(zhuǎn)換java對象為json的時候的入?yún)⒘耍阂簿褪沁@個方法:
JSONObject.toJSONString(Object object, SerializerFeature... features)
Fastjson的SerializerFeature序列化屬性:
1. QuoteFieldNames———-輸出key時是否使用雙引號,默認為true
2. WriteMapNullValue——–是否輸出值為null的字段,默認為false
3. WriteNullNumberAsZero—-數(shù)值字段如果為null,輸出為0,而非null
4. WriteNullListAsEmpty—–List字段如果為null,輸出為[],而非null
5. WriteNullStringAsEmpty—字符類型字段如果為null,輸出為”“,而非null
6. WriteNullBooleanAsFalse–Boolean字段如果為null,輸出為false,而非null
結(jié)合上面,SerializerFeature... features是個數(shù)組俐巴,那么我們可以傳入我們想要的參數(shù)骨望,比如想序列化null,案例如下:
1. public static void main(String[] args) {
2. AutoPartsSearchRequest request = new AutoPartsSearchRequest();
3. request.setKeywords("123");
4. request.setSortingField("234242");
5. String str = JSONObject.toJSONString(request, SerializerFeature.WriteMapNullValue);
6. System.out.println(str);
7. }
輸出結(jié)果如下:
3欣舵、想字符類型字段如果為null,轉(zhuǎn)換輸出為”“,而非null 擎鸠,需要多加一個參數(shù):WriteNullStringAsEmpty, 案例如下:
1. public static void main(String[] args) {
2. AutoPartsSearchRequest request = new AutoPartsSearchRequest();
3. request.setKeywords("123");
4. request.setSortingField("234242");
5. String str = JSONObject.toJSONString(request, SerializerFeature.WriteMapNullValue,
6. SerializerFeature.WriteNullStringAsEmpty);
7. System.out.println(str);
8. }
輸出結(jié)果如下:
二缘圈、Jackson
1劣光、jackson默認是序列化null對應的key的,也就是說不管你對象屬性有沒有值糟把,在轉(zhuǎn)換json的時候都會被序列化出來
1. public static void main(String[] args) throws JsonGenerationException,
JsonMappingException, IOException {
2. AutoPartsSearchRequest request = new AutoPartsSearchRequest();
3. request.setKeywords("123");
4. request.setSortingField("234242");
5. ObjectMapper mapper = new ObjectMapper();
6. String str = mapper.writeValueAsString(request);
7. System.out.println(str);
8. //輸出結(jié)果(此處就不格式化了):{"sortingField":"234242","partsClassifyId":null,
"partsSubClassifyId":null,"sortingDirection":null:......
9. }
2绢涡、同理,想要不序列化null也是可以的糊饱,具體如下:
1. 1.實體上
3. @JsonInclude(Include.NON_NULL)
5. //將該標記放在屬性上垂寥,如果該屬性為NULL則不參與序列化
6. //如果放在類上邊,那對這個類的全部屬性起作用
7. //Include.Include.ALWAYS 默認
8. //Include.NON_DEFAULT 屬性為默認值不序列化
9. //Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化
10. //Include.NON_NULL 屬性為NULL 不序列化
13. 2.代碼上
14. ObjectMapper mapper = new ObjectMapper();
16. mapper.setSerializationInclusion(Include.NON_NULL);
18. //通過該方法對mapper對象進行設(shè)置,所有序列化的對象都將按改規(guī)則進行系列化
19. //Include.Include.ALWAYS 默認
20. //Include.NON_DEFAULT 屬性為默認值不序列化
21. //Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化
22. //Include.NON_NULL 屬性為NULL 不序列化
注意:只對VO起作用,Map List不起作用滞项,另外jackson還能過濾掉你設(shè)置的屬性狭归,具體的就各位自己去研究源碼了
Jackson詳解
三、Gson
1文判、gson和fastjson一樣过椎,默認是不序列化null值對應的key的,具體案例如下:
1. public static void main(String[] args) throws JsonGenerationException,
JsonMappingException, IOException {
2. AutoPartsSearchRequest request = new AutoPartsSearchRequest();
3. request.setKeywords("123");
4. request.setSortingField("234242");
5. Gson g = new GsonBuilder().create();
6. String str = g.toJson(request);
7. System.out.println(str);
8. //輸出結(jié)果:{"sortingField":"234242","keywords":"123"}
9. }
2戏仓、若是想序列化null值對應的key疚宇,只需要將以上創(chuàng)建代碼改成以下代碼就行:
1. Gson g = new GsonBuilder().serializeNulls().create();