fastjson重复引用问题

661 阅读1分钟

前言

在使用fastjson进行json序列化时,发现对象中重复引用,会导致json出来的字符串出现$ref

问题

1、引入fastjson包

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.51</version>
</dependency>

2、定义一个实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    private Long id;

    private String name;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    private Long id;

    private List<Person> personList;
}

测试如下

public class FastJsonDemo {

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        Person person = new Person(1L, "aa");
        Student student1 = new Student(1L, List.of(person));
        Student student2 = new Student(2L, List.of(person));
        list.add(student1);
        list.add(student2);
        String data = JSON.toJSONString(list);
        System.out.println(data);

        List<Student> list1 = JSONArray.parseArray(data, Student.class);
        System.out.println(list1);
    }
}

结果如下

image.png 出现重复引用问题,导致解析出来的json有问题

解决方法

关闭FastJson的引用检测

JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);

public class FastJsonDemo {

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        Person person = new Person(1L, "aa");
        Student student1 = new Student(1L, List.of(person));
        Student student2 = new Student(2L, List.of(person));
        list.add(student1);
        list.add(student2);
        String data = JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect);
        System.out.println(data);

        List<Student> list1 = JSONArray.parseArray(data, Student.class);
        System.out.println(list1);
    }
}

输出如下

image.png