最近在使用fastjson时候遇到一个问题,后台的数据转化为json字符串后发送到前端时候出现了$ref字样的东西,后来明白了这是引用,下面详细介绍下。

一、一个简单的例子

先来上一段代码,运行后打印的结果可能出乎意料,代码如下:

@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));
}

上面代码运行后打印结果如下:

{"userList1":[{"id":0},{"id":1}],"userList2":[{"$ref":"$.userList1[0]"},{"$ref":"$.userList1[1]"}]}

从打印结果可以看到,里面含有了$ref等字符,为什么为这样呢,这就是引用,在传输的数据中出现相同的对象时,fastjson默认开启引用检测将相同的对象写成引用的形式。

二、引用的分类

引用分为两类,重复引用和循环引用

  1. 重复引用

指一个对象重复出现多次

  1. 循环引用

指你心里有我,我心里有你(互相引用),这个问题比较严重,如果处理不好就会出现StackOverflowError异常

三、如何关闭引用

有两种方式可以关闭fastjson的引用支持。关闭引用检测,还能够提升序列化时的性能。

  1. 全局配置关闭
  JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();

  1. 非全局关闭
 JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);

四、引用的语法

FastJson序列化出现$ref的的解决方案介绍完成了,有问题欢迎留言沟通哦!

反序列化的时候出现eof exception_FastJson序列化时候出现了$ref?还不赶紧学习下...相关推荐

  1. java-Transient关键字、Volatile关键字介绍和序列化、反序列化机制、单例类序列化

    - Transient关键字 Java的serialization提供了一种持久化对象实例的机制.当持久化对象时,可能有一个特殊的对象数据成员,我们不想  用serialization机制来保存它.为 ...

  2. 同一对象实例,序列化后,出现 {$ref:$. 的问题

    问题:如下 在传递一个json对象时,出现了下面的问题: detailImageDtoList是明细图片信息,mainImageDtoList所有图片信息,包含了detailImageDtoList中 ...

  3. 计算机更新系统d盘东西还在吗,电脑换系统后东西还在不在

    我们使用电脑的过程中,可能会遇到一些严重问题导致电脑无法正常使用,那么很多用户就会想到重装系统来解决,但是因为电脑中的重要文件很多,不知道电脑换系统后东西还在不在,重装系统通常是会格式化C盘,那么重装 ...

  4. Java序列化闲聊:序列化和Json

    前言 其实我挺纠结的,在纠结到底要不要写这个模块的博客,因为序列化这个模块说简单,按照一些人的说法,其实也就是调两个函数的事情,说困难,铺开就让人感觉范围很广. 序列化 什么是序列化,我们在编程的时候 ...

  5. layui绑定json_JSON绑定:概述系列

    layui绑定json JSON绑定的Java API(JSON-B)1.0增强了Java EE平台对JSON数据交换格式的整体支持. 事实证明, 用于JSON处理的Java API(JSON-P)1 ...

  6. 认识JSON绑定:概述系列

    JSON绑定的Java API(JSON-B)1.0增强了Java EE平台对JSON数据交换格式的整体支持. 事实证明, 用于JSON处理的Java API(JSON-P)1.1十分流行,它们共同构 ...

  7. 渣渣本科的2021届秋招总结-泪目

    引言 今年的秋招仿佛开始的格外的早,大概从7月开始就能在牛客上看见一些大厂的提前批开始的贴子,到了8月中下旬,秋招正式批也开始了,在牛客最直观的感受就是大佬们已经收割掉提前批的offer了,而菜鸡只能 ...

  8. 十三、序列化和反序列化(部分转载)

    json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...

  9. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

最新文章

  1. sql 自动递增 在java_java基础 之 操作符
  2. 网络编程学习笔记(udp_client函数)
  3. linux more 下一页_Linux学习笔记
  4. Docker 与 DevOps自动化部署实践
  5. Vue.js前后端分离2
  6. 怎样修改WIN7下的host文件
  7. 服务器高并发下出现大量的time wait的解决办法
  8. 最聪明的如何成为优秀的——微软高管指点成材路
  9. 看了一些东西,发现一些用css实现一些东西的小技巧就记录下来
  10. Continuous Laplacian, Functional Map, Spectral CNN
  11. [POJ1743]Musical Theme
  12. QQ特性,决定了杀死进程不能收到电话呼叫
  13. atitit.提升兼容性最佳实践 o9o
  14. 电脑版QQ更换透明背景教程(真的透明)
  15. Android: eoeAndroid ~
  16. 阿里开源共享:IDE导入阿里编码规约格式化模板和注释模板
  17. 日本語トレーニング(二十二)
  18. “华为杯“ 武汉大学21级新生程序设计竞赛错题笔记
  19. 计算机的扩展模式,Win7双屏复制/双屏扩展设置教程
  20. [转载]样式表编写效率手册 [ 日期:2004-10-15 ] [ 来自:Plod ]

热门文章

  1. 如何在ashx页面获取Session值 (仅供个人参考)
  2. Centos 升级GLIBCXX3.4.25
  3. linux下VI模式中上下左右键和回退键出现字母
  4. CGLib动态代理原理及实现
  5. python你是否也走进了这个误区了_Python是不是被严重高估了?
  6. [转载] 1022 D进制的A+B (20分)【java题解】【80ms】
  7. [转载] 使用Python编写打字训练小程序
  8. scala 当前日期_如何在Scala中检查当前日期和时间?
  9. java clock计时_Java Clock类| systemDefaultZone()方法与示例
  10. mongodb 排序_技术分享 | MongoDB 一次排序超过内存限制的排查