json对象出现$ref: "$.list[0]"的解决办法
该问题被称为 循环引用 (当一个对象包含另一个对象时,fastjson就会把该对象解析成引用)
{
"content": [
{
"age": 18,
"id": 3,
"name": "three"
},
{
"$ref": "$.content[0]"
},
{
"$ref": "$.content[0]"
}
],
...
}
首先了解一下为什么会出现以下这种情况?让我们再看看后台的模拟代码
@PostMapping(value = "/student/list", produces = MediaType.APPLICATION_JSON_VALUE)
public String studentList() {
List<Student> studentList = new ArrayList<>();
Student student = new Student();
student.setId(1);
student.setName("one");
student.setAge(12);
studentList.add(student);
student.setId(2);
student.setName("two");
student.setAge(15);
studentList.add(student);
student.setId(3);
student.setName("three");
student.setAge(18);
studentList.add(student);
for (Student s : studentList) {
System.out.println("student: " + s + "-hashCode: " + s.hashCode());
}
/* 打印结果:
student: Student(id=3, name=three, age=18)-hashCode: 110556370
student: Student(id=3, name=three, age=18)-hashCode: 110556370
student: Student(id=3, name=three, age=18)-hashCode: 110556370
*/
return JSON.toJSONString(studentList);
}
看似我们向 studentList 列表中放入三个 student对象 ,但是由于他们的地址是同一个,普通的JSON.toJSONString()解析就会出问题!
如果想解决这个问题可以使用fastjson提供的枚举类SerializerFeature的DisableCircularReferenceDetect转换方案
String s = JSON.toJSONStringWithDateFormat(object,"yyyy-MM-dd HH:mm:ss",SerializerFeature.DisableCircularReferenceDetect);
只需要将上面的后台案例代码改一下就OK了
@PostMapping(value = "/student/list", produces = MediaType.APPLICATION_JSON_VALUE)
public String studentList() {
... 中间代码不变
return JSON.toJSONStringWithDateFormat(studentList,"yyyy-MM-dd HH:mm:ss",SerializerFeature.DisableCircularReferenceDetect)
}
再次测试接口,结果如下:
[
{
"age": 18,
"id": 3,
"name": "three"
},
{
"age": 18,
"id": 3,
"name": "three"
},
{
"age": 18,
"id": 3,
"name": "three"
}
]
循环引用的问题得到解决。