使用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

發佈了43 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章