後臺服務返回Json資料出現$ref的問題解決方案
問題出現:使用FastJson的JSONArray型別作為返回資料,當像JSONArray物件中新增JSONObject物件,而JSONObject物件中包含相同的節點資料時,FastJson會防止返回資料棧溢位的問題,自動將JSONArray中相同的節點資料使用引用方式代替,即:{"$ref":$....[0]}
解決方案:
FastJson提供了相關的配置引數禁用迴圈引用。所以當我們再返回資料前對JSONArray進行進行操作即可,程式碼如下:
// jsonArray引數為原要返回的JSONArray資料 JSONArray jsonArrayRtn= JSONArray.parseArray(JSON.toJSONString(jsonArray, SerializerFeature.DisableCircularReferenceDetect));
當然FastJson還提供了其它配置引數,原始檔如下:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.alibaba.fastjson.serializer; public enum SerializerFeature { QuoteFieldNames, UseSingleQuotes, WriteMapNullValue, WriteEnumUsingToString, WriteEnumUsingName, UseISO8601DateFormat, WriteNullListAsEmpty, WriteNullStringAsEmpty, WriteNullNumberAsZero, WriteNullBooleanAsFalse, SkipTransientField, SortField, /** @deprecated */ @Deprecated WriteTabAsSpecial, PrettyFormat, WriteClassName, DisableCircularReferenceDetect, WriteSlashAsSpecial, BrowserCompatible, WriteDateUseDateFormat, NotWriteRootClassName, DisableCheckSpecialChar, BeanToArray, WriteNonStringKeyAsString, NotWriteDefaultValue, BrowserSecure, IgnoreNonFieldGetter; private final int mask = 1 << this.ordinal(); private SerializerFeature() { } public final int getMask() { return this.mask; } public static boolean isEnabled(int features, SerializerFeature feature) { return (features & feature.getMask()) != 0; } public static boolean isEnabled(int features, int fieaturesB, SerializerFeature feature) { int mask = feature.getMask(); return (features & mask) != 0 || (fieaturesB & mask) != 0; } public static int config(int features, SerializerFeature feature, boolean state) { if (state) { features |= feature.getMask(); } else { features &= ~feature.getMask(); } return features; } public static int of(SerializerFeature[] features) { if (features == null) { return 0; } else { int value = 0; SerializerFeature[] var2 = features; int var3 = features.length; for(int var4 = 0; var4 < var3; ++var4) { SerializerFeature feature = var2[var4]; value |= feature.getMask(); } return value; } } }
名稱 | 含義 | 備註 |
---|---|---|
QuoteFieldNames | 輸出key時是否使用雙引號,預設為true | |
UseSingleQuotes | 使用單引號而不是雙引號,預設為false | |
WriteMapNullValue | 是否輸出值為null的欄位,預設為false | |
WriteEnumUsingToString | Enum輸出name()或者original,預設為false
|
|
WriteEnumUsingName | ||
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 | |
WriteTabAsSpecial | 把\t做轉義輸出,預設為false | 不推薦 |
PrettyFormat | 結果是否格式化,預設為false | 不推薦 |
WriteClassName | 序列化時寫入型別資訊,預設為false。反序列化是需用到 | 不推薦 |
DisableCircularReferenceDetect | 消除對同一物件迴圈引用的問題,預設為false 當進行toJSONString的時候,預設如果重用物件的話,會使用引用的方式進行引用物件。
迴圈引用很多場景中,我們需要序列化的物件中存在迴圈引用,在許多的json庫中,這會導致stackoverflow。在功能強大的fastjson中,你不需要擔心這個問題。例如:
引用是通過"$ref"來表示的 引用描述
|
不推薦 |
WriteSlashAsSpecial | 對斜槓’/’進行轉義 | 不推薦 |
BrowserCompatible | 將中文都會序列化為\uXXXX格式,位元組數會多一些,但是能相容IE 6,預設為false | 不推薦 |
WriteDateUseDateFormat | 全域性修改日期格式,預設為false。 JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”; JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); |
不推薦 |
DisableCheckSpecialChar | 一個物件的字串屬性中如果有特殊字元如雙引號,將會在轉成json時帶有反斜槓轉移符。如果不需要轉義,可以使用這個屬性。預設為false | 不推薦 |
NotWriteRootClassName | 含義 | 不推薦 |
BeanToArray | 將物件轉為array輸出 | 不推薦 |
WriteNonStringKeyAsString | 不推薦 | |
NotWriteDefaultValue | 不推薦 | |
BrowserSecure | 不推薦 | |
IgnoreNonFieldGetter | 不推薦 |