• FastJson序列化时候出现了$ref?还不赶紧学习下


    最近在使用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的的解决方案介绍完成了,有问题欢迎留言沟通哦!

    推荐阅读

    1.一分钟带你了解下java中的fork/join!

    2.fastjson自定义序列化竟然有这么多姿势?

    3.SpringBoot2.0整合集成WebSocket,实现后端数据实时推送!

    4.一分钟带你了解下MyBatis的动态SQL!

    5.一分钟带你了解下Spring Security!


    如果觉得文章不错,希望可以随手转发或者”在看“哦,非常感谢哈!

    关注下方公众号后回复「1024」,有惊喜哦!

  • 相关阅读:
    CSUOJ 1554 SG Value
    php面试之四-Linux部分
    php常用算法
    php综合运用技术
    面试基础
    面试题系列1
    面试题系列
    php面试题之五——MySQL数据库(基础部分)
    php面试之数据结构和算法
    asp.net导出Excel类库
  • 原文地址:https://www.cnblogs.com/haha12/p/12201634.html
Copyright © 2020-2023  润新知