import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.serializer.SerializerFeature;/** * fastjson中$ref对象重复引用问题 * ?* 介绍: * FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。 * 关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。 * ?* 用法: * JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect); */public class TestFastJson { ???List<Person> list = new ArrayList<Person>(); ???Person p = new Person("ZhangSan", 23); ???/** ????* ?测试main ????*/ ???public static void main(String[] args) { ???????// new TestFastJson().test1(); ???????new TestFastJson().test2(); ???} ???/** ????* 未关闭引用检测,转化字符串时会出现$ref ????*/ ???public void test1() { ???????list.add(p); ???????list.add(p); ???????String jsonStr = JSON.toJSONString(list); ???????System.out.println(jsonStr); ???????// [{"age":23,"name":"ZhangSan"},{"$ref":"$[0]"}] ???} ???/** ????* 关闭引用检测后,$ref的问题就会被解决 ????*/ ???public void test2() { ???????list.add(p); ???????list.add(p); ???????String jsonStr = JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect); ???????System.out.println(jsonStr); ???????// [{"age":23,"name":"ZhangSan"},{"age":23,"name":"ZhangSan"}] ???}}class Person { ???private String name; ???private int age; ???// 构造函数 ???public Person(String name, int age) { ???????super(); ???????this.name = name; ???????this.age = age; ???} ???// getters/setters(略)}
fastjson生成JSON字符串的时候出现$ref
原文地址:http://www.cnblogs.com/shibazizhan/p/7688206.html