首先,說一下出現問題的原因:後臺傳過去的json數據用了阿里巴巴的fastjson轉換,但是有個問題就是:解析list中引用的數據時,jvm避免數據溢出,會自動處理爲“循環引用”,因此,也就出現了問題的根源{"$ref":"$.data[0].task.OBJECTS[0]"},數據以引用的方式傳給前臺,前臺卻無法解析到那段引用的數據。
循環引用:當一個對象包含另一個對象時,fastjson就會把該對象解析成引用。
然後,知道了問題的根源,就知道往什麼方向解決問題了--禁止循環引用。解決方案如下所示:
注:map中存放了你需要傳到前臺的數據對象:data!並且data中的對象數據存在循環引用。
網上的解決方案:
JSON.toJSONString(list,SerializerFeature.DisableCircularReferenceDetect)
注:不管你是引用JSON,還是JSONObject,主要是看你想傳的對象是啥類型,然後轉換成JSON / JSONObject
下面介紹一些引用的描述:
- "$ref":".." 上一級
- "$ref":"@" 當前對象,也就是自引用
- "$ref":"$" 根對象
- "$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