详解在springmvc中解决FastJson循环引用的问题
我们先来看一个例子:
packagecom.elong.bms; importjava.io.OutputStream; importjava.util.HashMap; importjava.util.Map; importcom.alibaba.fastjson.JSON; publicclassTest{ publicstaticvoidmain(String[]args){ Map<String,Student>maps=newHashMap<String,Student>(); Students1=newStudent("s1",16); maps.put("s1",s1); maps.put("s2",s1); byte[]bytes=JSON.toJSONBytes(maps); System.out.println(newString(bytes)); } }
输出:
{"s1":{"age":16,"name":"s1"},"s2":{"$ref":"$.s1"}}
可以看到,这个json如果发到前端是无法使用的,幸好FastJson提供了解决办法,我们来看下,解决办法为禁用循环引用检测,代码如下:
packagecom.elong.bms; importjava.io.OutputStream; importjava.util.HashMap; importjava.util.Map; importcom.alibaba.fastjson.JSON; importcom.alibaba.fastjson.serializer.SerializerFeature; publicclassTest{ publicstaticvoidmain(String[]args){ Map<String,Student>maps=newHashMap<String,Student>(); Students1=newStudent("s1",16); maps.put("s1",s1); maps.put("s2",s1); SerializerFeaturefeature=SerializerFeature.DisableCircularReferenceDetect; byte[]bytes=JSON.toJSONBytes(maps,feature); System.out.println(newString(bytes)); } }
输出如下:
{"s1":{"age":16,"name":"s1"},"s2":{"age":16,"name":"s1"}}
问题是如果我们在springmvc中使用的时候,需要将SerializerFeature注入到MessageConverter里面, FastJsonHttpMessageConverter
但是SerializerFeature是一个enum类型的,又是一个array,考虑到大部分人对这个不熟悉,直接上代码了。
<beanid="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <propertyname="supportedMediaTypes"value="application/json;charset=UTF-8"/> <propertyname="features"> <arrayvalue-type="com.alibaba.fastjson.serializer.SerializerFeature"> <value>DisableCircularReferenceDetect</value> </array> </property> </bean> <beanid="DisableCircularReferenceDetect"class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <propertyname="staticField"value="com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect"></property> </bean>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。