FastJson中“$ref 循环引用”的问题

逻辑工匠
• 阅读 150

在前几天的时候,我使用fastjson的时候,发现一个问题,就是如果一个集合里面添加相同的一个对象,然后将集合转化为对应的json字符串,发送到页面去解析的时候,发现只能够读出第一个对象,后面的对象就读不出来,页面上显示的代码:

从页面图片我们可以看到,添加了重复的seller之后,只有第一个可以正常显示,后面的都是显示为$ref:"$.rows[0].seller",出现这种现象的原因是fastjson开启了fastjson的“循环引用检测”机制,这种机制会让fastjson在对于将Java对象转化为对应的json对象的时候,同一个对象的使用,下面的对象都改为了对前面对象的应用,所以,这就是我们为什么看到"$.rows[0].seller"这个东西的原因,那么,我们只要讲这种“循环引用检测”机制关掉即可
如果是直接使用fastjson的话,可以这样关掉:
在将对象转化为json的时候,添加这个:SerializerFeature.DisableCircularReferenceDetect
SerializerFeature.DisableCircularReferenceDetect:关闭fastjson的循环引用检测,例如:
protected String writeJson(Object result) throws IOException {

            // 把result转换为json
            String json = JSON.toJSONString(result,SerializerFeature.DisableCircularReferenceDetect);
            // 把json字符串返回给页面
            HttpServletResponse response = ServletActionContext.getResponse();
            // 设置回显数据的编码
            response.setCharacterEncoding("utf-8");
            //response.setContentType("text/json;charset=utf-8");
            response.getWriter().write(json);
            // NONE:代表不返回视图
            return NONE;
    }

如果是是使用了spring+springmvc的方式的话,可以添加
[/table]
[table=50%]
<!-- spring解析返回结果成json -->

    <mvc:message-converters register-defaults="true">
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                    <value>application/json</value>
                </list>
            </property>
            <property name="features">
                <list>
                    <value>PrettyFormat</value>
                    <value>WriteMapNullValue</value>
                    <value>WriteNullStringAsEmpty</value>
                    <value>WriteNullListAsEmpty</value>
                    <value>DisableCircularReferenceDetect</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>


点赞
收藏
评论区
推荐文章
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Wesley13 Wesley13
3年前
javaweb之jsp的属性范围
1.什么是jsp的属性范围?所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以保存并继续使用。jsp提供了四种属性范围,如下:当前页,对应的jsp对象为pageContext,属性的作用范围仅限于当前JSP页面,跳转到其他页面无法取得。一次服务请求,对应的jsp对象为request,属性的作用范围仅限于同一个请求。
Wesley13 Wesley13
3年前
FastJson、Jackson、Gson进行Java对象转换Json的细节处理
Java对象转换Json的细节处理前言Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式一、fastJson1、fastJson在转换java对象为json的时候,默认是不序列化nu
Wesley13 Wesley13
3年前
2、尚硅谷_SSM高级整合_使用ajax操作实现页面的查询功能
16、尚硅谷\_SSM高级整合\_查询\_返回分页的json数据.avi在上一章节的操作中我们是将PageInfo对象存储在request域中,然后list页面解析request域中的对象实现信息的显示。但是上面的操作只适合客户端是浏览器的情况。如果客户端是android,也要查询人员列表信息,这个时候服务器返回的数据应该是json数据,所以我们需要对后
Wesley13 Wesley13
3年前
GSON搞定任何JSON数据
Gson介绍:GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。特点:a、快速、高效    b、代码量少、简洁c、面向对象d、数据传递和解析方便Gson的p
Wesley13 Wesley13
3年前
Java基础学习总结(8)——super关键字
一、super关键字  在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。
Wesley13 Wesley13
3年前
Java中的Map集合
Map接口简介Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value,Map中的键必须是唯一的,不能重复,如果存储了相同的键,后存储的值会覆盖原有的值,简而言之就是键相同,值覆盖。Map常用
Wesley13 Wesley13
3年前
JAVA 判断字符串是否可转化为JSONObject、JSONArray
有时,我们需要判断字符串在转化为JSON对象或者JSONArray时,我们可以使用JSONObject.parseObject和JSONArray.parseArray,但是有时候我们需要在转化之前判断该字符串是否能够被转化为JSON对象或者数组。由于没有找到较好的方法,只能暂时用以下方法了。1/2判断字符串是否可以转化
Stella981 Stella981
3年前
FastJson 反序列化注意事项
问题描述使用fastJson对json字符串进行反序列化时,有几个点需要注意一下:反序列化内部类反序列化模板类0\.Getter/Setter问题如我们希望返回的一个json串为"name":"name","isDeleted":true,"isEmpty":1
Wesley13 Wesley13
3年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Stella981 Stella981
3年前
JVM笔记整理
不对之处还望指正。垃圾回收1\.如何判断对象是垃圾对象?引用计数法在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值1,当引用失效时,则值1.此方式不能解决循环引用的问题。验证添加gc日志,\_005GC.javaverbose:gc