前言
在使用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);
}
}
结果如下
出现重复引用问题,导致解析出来的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);
}
}
输出如下