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

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

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

UserInfoBean 的大致内容:

public class UserInfoBean implements Serializable {

    public int id;

    // xxx data

    // 端口列表
    private PortInfoBean portInfoBean;

    public UserInfoBean() {
    }
}

PortInfoBean 的大致内容:

ublic class PortInfoBean {
    // 全部port
    public List<String> all_port_list;

    // xxx data
}

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

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

这时候发现,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) ;

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

<bean id="jsonConverter"  io

       class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">  ast

      <property name="supportedMediaTypes" value="application/json;charset=UTF-8"/>  class

      <property name="features">  配置

        <array value-type="com.alibaba.fastjson.serializer.SerializerFeature">  循环

           <value>DisableCircularReferenceDetect</value>  引用

       </array>  

     </property>  

 </bean>  

 <bean id="DisableCircularReferenceDetect" 

      class="org.springframework.beans.factory.config.Fiel   dRetrievingFactoryBean">  

  <property name="staticField" 

      value="com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect">

  </property>  

</bean>  

参考:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值