json对象出现$ref: "$.list[0]"的解决办法


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"
  }
]

循环引用的问题得到解决。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM