使用JSON.toJSONString()返回{}的原因
JSON.toJSONString()返回{}原因
測(cè)試代碼
public static void main(String[] args) {undefined
ResultModel resultModel = ResultModel.error(“110”,“error”);
System.out.println(JSON.toJSONString(resultModel));
}原因
ResultModel 未添加Getter,只需添加Getter即可
JSON.toJSONString的坑有些字段沒(méi)有了
1.問(wèn)題
在使用fastjson中的JSON.toJSONString方法將對(duì)象轉(zhuǎn)換成json字符串的時(shí)候,發(fā)現(xiàn)有些字段沒(méi)有了。如:
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é)果中沒(méi)有了 "name"這個(gè)屬性了;
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串,默認(rèn)設(shè)置了許多序列化配置:
| 名稱 | 含義 | 備注 |
| 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 | 字符類型字段如果為null,輸出為”“,而非null | |
| WriteNullNumberAsZero | 數(shù)值字段如果為null,輸出為0,而非null | |
| WriteNullBooleanAsFalse | Boolean字段如果為null,輸出為false,而非null | |
| SkipTransientField | 如果是true,類中的Get方法對(duì)應(yīng)的Field是transient,序列化時(shí)將會(huì)被忽略。默認(rèn)為true | |
| SortField | 按字段名稱排序后輸出。默認(rèn)為false | |
| WriteTabAsSpecial | 把\t做轉(zhuǎn)義輸出,默認(rèn)為false | |
| PrettyFormat | 結(jié)果是否格式化,默認(rèn)為false | |
| WriteClassName | 序列化時(shí)寫入類型信息,默認(rèn)為false。反序列化是需用到 | |
| DisableCircularReferenceDetect | 消除對(duì)同一對(duì)象循環(huán)引用的問(wèn)題,默認(rèn)為false | |
| WriteSlashAsSpecial | 對(duì)斜杠’/’進(jìn)行轉(zhuǎn)義 | |
| BrowserCompatible | 將中文都會(huì)序列化為\uXXXX格式,字節(jié)數(shù)會(huì)多一些,但是能兼容IE 6,默認(rèn)為false | |
| WriteDateUseDateFormat | 全局修改日期格式,默認(rèn)為false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); | |
| DisableCheckSpecialChar | 一個(gè)對(duì)象的字符串屬性中如果有特殊字符如雙引號(hào),將會(huì)在轉(zhuǎn)成json時(shí)帶有反斜杠轉(zhuǎn)移符。如果不需要轉(zhuǎn)義,可以使用這個(gè)屬性。默認(rèn)為false | |
| NotWriteRootClassName | ||
| BeanToArray | 將對(duì)象轉(zhuǎn)為array輸出 | |
| WriteNonStringKeyAsString | 不是String的字段寫為String | |
| NotWriteDefaultValue | 不設(shè)默認(rèn)值 | |
| BrowserSecure | ||
| IgnoreNonFieldGetter | 忽略沒(méi)有g(shù)etter方法的屬性 | |
| WriteEnumUsingName | 目前版本的fastjson默認(rèn)對(duì)enum對(duì)象使用WriteEnumUsingName屬性,因此會(huì)將enum值序列化為其Name。 使用WriteEnumUsingToString方法可以序列化時(shí)將Enum轉(zhuǎn)換為toString()的返回值;同時(shí)override toString函數(shù)能夠?qū)num值輸出需要的形式。但是這樣做會(huì)帶來(lái)一個(gè)問(wèn)題,對(duì)應(yīng)的反序列化使用的Enum的靜態(tài)方法valueof可能無(wú)法識(shí)別自行生成的toString(),導(dǎo)致反序列化出錯(cuò)。 如果將節(jié)省enum序列化后的大小,可以將enum序列化其ordinal值,保存為int類型。fastJson在反序列化時(shí),如果值為int,則能夠使用ordinal值匹配,找到合適的對(duì)象。 fastjson要將enum序列化為ordinal只需要禁止WriteEnumUsingName feature。 首先根據(jù)默認(rèn)的features排除WriteEnumUsingName,然后使用新的features序列化即可。 |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java int與integer的對(duì)比區(qū)別
這篇文章主要介紹了Java int與integer的對(duì)比區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-01-01
Java 中使用數(shù)組存儲(chǔ)和操作數(shù)據(jù)
本文將介紹Java中常用的數(shù)組操作方法,通過(guò)詳細(xì)的示例和解釋,幫助讀者全面理解和掌握這些方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
SpringBoot工程中Spring Security應(yīng)用實(shí)踐記錄流程分析
Spring Security是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問(wèn)控制解決方案的安全框架。這篇文章主要介紹了SpringBoot工程中Spring Security應(yīng)用實(shí)踐,需要的朋友可以參考下2021-09-09
Java獲取HttpServletRequest的三種方法詳解
這篇文章主要介紹了Java獲取HttpServletRequest的三種方法詳解,是一個(gè)接口,全限定名稱為Jakarta.Serclet.http.HttpServletRequest2023-11-11
HttpServletRequest接口是Servlet規(guī)范的一員,需要的朋友可以參考下
關(guān)于mybatis if else if 條件判斷SQL片段表達(dá)式取值和拼接問(wèn)題
這篇文章主要介紹了mybatis if else if 條件判斷SQL片段表達(dá)式取值和拼接,文章通過(guò)自己真實(shí)使用的例子給大家詳細(xì)介紹,需要的朋友可以參考下2021-09-09
Mybatisplus自動(dòng)填充實(shí)現(xiàn)方式及代碼示例
這篇文章主要介紹了Mybatisplus自動(dòng)填充實(shí)現(xiàn)方式及代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
JavaFX Metro UI 和 開(kāi)發(fā)庫(kù)使用簡(jiǎn)介
這篇文章主要介紹了JavaFX Metro UI 和 開(kāi)發(fā)庫(kù)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08

