• FastJson解析对象出现 “$ref“:“$[0].portInfoBean“ 导致list数据错乱的解决方案


    设计是 UserInfoBean 的 list ,其中包含两组数据 A1,A2

    public static List mUserInfoList = new ArrayList<>();

    UserInfoBean 的大致内容:

    1. public class UserInfoBean implements Serializable {
    2. public int id;
    3. // xxx data
    4. // 端口列表
    5. private PortInfoBean portInfoBean;
    6. public UserInfoBean() {
    7. }
    8. }

    PortInfoBean 的大致内容:

    1. ublic class PortInfoBean {
    2. // 全部port
    3. public List all_port_list;
    4. // xxx data
    5. }

    当我修改了A1: mUserInfoList.get(0).portInfoBean = new PortInfoBean(xxx);

    然后用 fastJson 转成 jsonString ,再从 jsonString 转回 List  对象

    这时候发现,mUserInfoList.get(0).portInfoBean 和 mUserInfoList.get(1).portInfoBean ,获取到的portInfoBean对象内容是一样的。

    检查jsonString时,发现是(手工还原,可能不完美准)

    [{"id":0,"portInfoBean":{"all_port_list":["eth0","eth1"]}},{"id":1,"portInfoBean":{"$ref":"$[0].portInfoBean"}}]

    看出来应该是 "$ref":"$[0].portInfoBean" 导致的。 

    第二个UserInfoBean 中的PortInfoBean 直接引用了第一个UserInfoBean 中的内容。

    这个问题是由于fastjson默认开启了“循环引用检测”,若是数据中出现对象嵌套的状况,就会出现上述问题。 


    解决方案:

    实测方案一解决。

    一、直接修改代码,只须要在数据返回时,在代码强制关闭循环引用检测功能:

    JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect) ;

    二、修改配置文件,经过配置文件的修改不须要每一个地方都须要经过代码显示关闭该特性:

    1. <bean id="jsonConverter"  io
    2.        class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">  ast
    3.       <property name="supportedMediaTypes" value="application/json;charset=UTF-8"/>  class
    4.       <property name="features">  配置
    5.         <array value-type="com.alibaba.fastjson.serializer.SerializerFeature">  循环
    6.            <value>DisableCircularReferenceDetectvalue>  引用
    7.        array>  
    8.      property>  
    9.  bean>  
    10.  <bean id="DisableCircularReferenceDetect" 
    11.       class="org.springframework.beans.factory.config.Fiel   dRetrievingFactoryBean">  
    12.   <property name="staticField" 
    13.       value="com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect">
    14.   property>  
    15. bean>  

    参考:

    json数据出现$ref: "$.list[0]"的解决办法 - JavaShuo

  • 相关阅读:
    Qt文件系统
    Stateless DHCPv6
    服务器(Linux)配置node环境及运行ts文件(express框架)
    Aspose.Words使用教程之插入文档元素(三)
    动态规划简述;斐波那契数列自顶向下和自底向上
    linux vim 删除多行
    ChatGPT、AIGC、大语言模型都是啥?
    jQuery基础教程
    关于XXLJOB集群模式下调度失败的问题
    leetcode-67:二进制求和
  • 原文地址:https://blog.csdn.net/vistaup/article/details/126017272