使用Fastjson解析List对象时出现$ref: "$.list[0]"的问题原因及解决方法

2023-11-10

1. 遇到的问题:
在解析List时,List的对象中又包含了一个对象。然后使用JSON.toJSONString(List<>); 
就出现了问题如下: 
"tokenDTO": { 
"$ref": "$.balanceList[1].tokenDTO" 
}, 
然后,百度了一下,出现”ref":"ref":".balanceList[1].tokenDTO”就是循环引用造成的。 
循环引用:当一个对象包含另一个对象时,fastjson就会把该对象解析成引用。

2. 原因:
$ref 标示的,下面介绍一些引用的描述
"$ref":".." 上一级
"$ref":"@" 当前对象,也就是自引用
"$ref":"$" 根对象
"$ref":"$.children.0" 基于路径的引用,相当于 root.getChildren().get(0)
1
2
3
4
5
3.解决方案
JSON.toJSONString(this,SerializerFeature.DisableCircularReferenceDetect)
1
这就是禁止循环引用的方案。然后输出就正常了! 
下面是SerializerFeature中的参数类型感兴趣的通过可以了解下!

    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 //暂不知,求告知

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Fastjson解析List对象时出现$ref: "$.list[0]"的问题原因及解决方法 的相关文章

随机推荐