使用JSON.toJSONString()返回{}的原因
JSON.toJSONString()返回{}原因
測試代碼
public static void main(String[] args) {undefined ResultModel resultModel = ResultModel.error(“110”,“error”); System.out.println(JSON.toJSONString(resultModel)); }
原因
ResultModel 未添加Getter,只需添加Getter即可
JSON.toJSONString的坑有些字段沒有了
1.問題
在使用fastjson中的JSON.toJSONString方法將對象轉(zhuǎn)換成json字符串的時候,發(fā)現(xiàn)有些字段沒有了。如:
public static void main(String[] args) { ? ? ? ? Map<String,Object>map=new HashMap<>(); ? ? ? ? map.put("id","1"); ? ? ? ? map.put("name",null); ? ? ? ? System.out.println(JSON.toJSONString(map)); ? ? }
輸出結(jié)果: {"id":"1"}
輸出結(jié)果中沒有了 "name"這個屬性了;
2.解決方式
加SerializerFeature.WriteMapNullValue)
public static void main(String[] args) { ? ? ? ? Map<String,Object>map=new HashMap<>(); ? ? ? ? map.put("id","1"); ? ? ? ? map.put("name",null); ? ? ? ? System.out.println(JSON.toJSONString(map,SerializerFeature.WriteMapNullValue)); ? ? }
輸出結(jié)果: {"name":null,"id":"1"}
3.原因
轉(zhuǎn)json串,默認設(shè)置了許多序列化配置:
名稱 | 含義 | 備注 |
QuoteFieldNames | 輸出key時是否使用雙引號,默認為true | |
UseSingleQuotes | 使用單引號而不是雙引號,默認為false | |
WriteMapNullValue | 是否輸出值為null的字段,默認為false | |
WriteEnumUsingToString | Enum輸出name()或者original,默認為false | |
UseISO8601DateFormat | Date使用ISO8601格式輸出,默認為false | |
WriteNullListAsEmpty | List字段如果為null,輸出為[],而非null | |
WriteNullStringAsEmpty | 字符類型字段如果為null,輸出為”“,而非null | |
WriteNullNumberAsZero | 數(shù)值字段如果為null,輸出為0,而非null | |
WriteNullBooleanAsFalse | Boolean字段如果為null,輸出為false,而非null | |
SkipTransientField | 如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。默認為true | |
SortField | 按字段名稱排序后輸出。默認為false | |
WriteTabAsSpecial | 把\t做轉(zhuǎn)義輸出,默認為false | |
PrettyFormat | 結(jié)果是否格式化,默認為false | |
WriteClassName | 序列化時寫入類型信息,默認為false。反序列化是需用到 | |
DisableCircularReferenceDetect | 消除對同一對象循環(huán)引用的問題,默認為false | |
WriteSlashAsSpecial | 對斜杠’/’進行轉(zhuǎn)義 | |
BrowserCompatible | 將中文都會序列化為\uXXXX格式,字節(jié)數(shù)會多一些,但是能兼容IE 6,默認為false | |
WriteDateUseDateFormat | 全局修改日期格式,默認為false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); | |
DisableCheckSpecialChar | 一個對象的字符串屬性中如果有特殊字符如雙引號,將會在轉(zhuǎn)成json時帶有反斜杠轉(zhuǎn)移符。如果不需要轉(zhuǎn)義,可以使用這個屬性。默認為false | |
NotWriteRootClassName | ||
BeanToArray | 將對象轉(zhuǎn)為array輸出 | |
WriteNonStringKeyAsString | 不是String的字段寫為String | |
NotWriteDefaultValue | 不設(shè)默認值 | |
BrowserSecure | ||
IgnoreNonFieldGetter | 忽略沒有g(shù)etter方法的屬性 | |
WriteEnumUsingName | 目前版本的fastjson默認對enum對象使用WriteEnumUsingName屬性,因此會將enum值序列化為其Name。 使用WriteEnumUsingToString方法可以序列化時將Enum轉(zhuǎn)換為toString()的返回值;同時override toString函數(shù)能夠?qū)num值輸出需要的形式。但是這樣做會帶來一個問題,對應的反序列化使用的Enum的靜態(tài)方法valueof可能無法識別自行生成的toString(),導致反序列化出錯。 如果將節(jié)省enum序列化后的大小,可以將enum序列化其ordinal值,保存為int類型。fastJson在反序列化時,如果值為int,則能夠使用ordinal值匹配,找到合適的對象。 fastjson要將enum序列化為ordinal只需要禁止WriteEnumUsingName feature。 首先根據(jù)默認的features排除WriteEnumUsingName,然后使用新的features序列化即可。 |
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
只用400行Java代碼就能實現(xiàn)的飛翔的小鳥游戲
今天給大家?guī)淼氖顷P(guān)于Java實戰(zhàn)的相關(guān)知識,文章圍繞著只用400行Java代碼就能實現(xiàn)的飛翔的小鳥游戲展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06使用FeignClient進行微服務交互方式(微服務接口互相調(diào)用)
這篇文章主要介紹了使用FeignClient進行微服務交互方式(微服務接口互相調(diào)用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Java多線程編程中使用Condition類操作鎖的方法詳解
Condition是java.util.concurrent.locks包下的類,提供了對線程鎖的更精細的控制方法,下面我們就來看一下Java多線程編程中使用Condition類操作鎖的方法詳解2016-07-07java編程下字符串的16位,32位md5加密實現(xiàn)方法
下面小編就為大家?guī)硪黄猨ava編程下字符串的16位,32位md5加密實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09Spring如何動態(tài)自定義logback日志目錄詳解
這篇文章主要給大家介紹了關(guān)于Spring如何動態(tài)自定義logback日志目錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-10-10Java class文件格式之屬性_動力節(jié)點Java學院整理
在本文中, 主要講解了class文件中的一些屬性。 這些屬性可以出現(xiàn)在class文件中的對個地方, 用來描述一些其他信息2017-06-06