最近在使用fastjson时候遇到一个问题,后台的数据转化为json字符串后发送到前端时候出现了$ref字样的东西,后来明白了这是引用,下面详细介绍下。前端
先来上一段代码,运行后打印的结果可能出乎意料,代码以下:java
@org.junit.Test public void testFastJson() { Map<String, Object> dataMap = new HashMap<>(); List<User> userList1 = new ArrayList<>(); List<User> userList2 = new ArrayList<>(); for (int i = 0; i < 2; i++) { User user = new User(); user.setId(i); userList1.add(user); userList2.add(user); } dataMap.put("userList1", userList1); dataMap.put("userList2", userList2); System.out.println(JSON.toJSONString(dataMap)); }
上面代码运行后打印结果以下:json
{"userList1":[{"id":0},{"id":1}],"userList2":[{"$ref":"$.userList1[0]"},{"$ref":"$.userList1[1]"}]}
从打印结果能够看到,里面含有了$ref等字符,为何为这样呢,这就是引用,在传输的数据中出现相同的对象时,fastjson默认开启引用检测将相同的对象写成引用的形式。后端
引用分为两类,重复引用和循环引用性能
指一个对象重复出现屡次code
指你内心有我,我内心有你(互相引用),这个问题比较严重,若是处理很差就会出现StackOverflowError异常对象
有两种方式能够关闭fastjson的引用支持。关闭引用检测,还可以提高序列化时的性能。blog
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
FastJson序列化出现$ref的的解决方案介绍完成了,有问题欢迎留言沟通哦!字符串
推荐阅读get
3.SpringBoot2.0整合集成WebSocket,实现后端数据实时推送!
若是以为文章不错,但愿能够随手转发或者”在看“哦,很是感谢哈!
关注下方公众号后回复「1024」,有惊喜哦!