黑马程序员技术交流社区
标题: 【广州校区】+【原创】FastJson中“$ref 循环引用”的问题 [打印本页]
作者: Mylo 时间: 2018-10-18 11:33
标题: 【广州校区】+【原创】FastJson中“$ref 循环引用”的问题
在前几天的时候,我使用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>
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |