使用Fastjson解析List對象時出現:{"$ref":"$.data[0].task.OBJECTS[0]"}的問題原因及解決方法


首先,說一下出現問題的原因:后台傳過去的json數據用了阿里巴巴的fastjson轉換,但是有個問題就是:解析list中引用的數據時,jvm避免數據溢出,會自動處理為“循環引用”,因此,也就出現了問題的根源{"$ref":"$.data[0].task.OBJECTS[0]"},數據以引用的方式傳給前台,前台卻無法解析到那段引用的數據

循環引用:當一個對象包含另一個對象時,fastjson就會把該對象解析成引用。

然后,知道了問題的根源,就知道往什么方向解決問題了--禁止循環引用。解決方案如下所示

注:map中存放了你需要傳到前台的數據對象:data!並且data中的對象數據存在循環引用。

網上的解決方案:

JSON.toJSONString(list,SerializerFeature.DisableCircularReferenceDetect)

注:不管你是引用JSON,還是JSONObject,主要是看你想傳的對象是啥類型,然后轉換成JSON / JSONObject

 

下面介紹一些引用的描述:

  1. "$ref":".." 上一級
  2. "$ref":"@" 當前對象,也就是自引用
  3. "$ref":"$" 根對象
  4. "$ref":"$.children.0" 基於路徑的引用,相當於 root.getChildren().get(0)

 

下面是SerializerFeature中的參數類型,感興趣的同學可以了解一下!(當然,最主要的還是記下來,有備自己以后查看,233 ~:)

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,//數值字段如果為null,輸出為0,而非null

WriteNullBooleanAsFalse,//Boolean字段如果為null,輸出為false,而非null

SkipTransientField,//如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。默認為true

SortField,//按字段名稱排序后輸出。默認為false

@Deprecated
WriteTabAsSpecial,//把\t做轉義輸出,默認為false

PrettyFormat,//結果是否格式化,默認為false

WriteClassName,//序列化時寫入類型信息,默認為false。反序列化是需用到

DisableCircularReferenceDetect,//消除對同一對象循環引用的問題,默認為false

WriteSlashAsSpecial,//對斜杠'/'進行轉義

BrowserCompatible,//將中文都會序列化為\uXXXX格式,字節數會多一些,但是能兼容IE 6,默認為false

WriteDateUseDateFormat,//全局修改日期格式,默認為false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

NotWriteRootClassName,//暫不知,求告知

DisableCheckSpecialChar,//一個對象的字符串屬性中如果有特殊字符如雙引號,將會在轉成json時帶有反斜杠轉移符。如果不需要轉義,可以使用這個屬性。默認為false

BeanToArray //暫不知,求告知

參考了該博文:https://blog.csdn.net/zgz15515397650/article/details/79927483


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM