com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现“$ref“:“$[0]“现象问题

文章目录

1、问题介绍

有些场景下,我们会选择用JSONObject代替Map来处理业务逻辑,但是使用JSONObject时有一个需要注意的地方:在处理JSONObject对象时,引用的com.alibaba.fastjson.JSONObject,在一个集合中,循环给这个对象赋值会出现"ref":" 0",它会认为是一个对象,就出现$ref。

2、如何解决fastjson中$ref对象重复引用问题

FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。

关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。

用法:JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);

3、举例说明

一份班级信息,两个学生,现在要所有学生,每个学生领着自己的完整信息的集合返回:

java 复制代码
public static void main(String[] args) {
        JSONObject base=new JSONObject();
        base.put("class_info", "班级信息");

        List<String> userNames=new ArrayList();
        JSONObject programs = new JSONObject();
        userNames.add("学生一");
        userNames.add("学生二");
        if (!CollectionUtils.isEmpty(userNames)) {
            for (String name : userNames) {
                JSONObject baseInfo = base;
                baseInfo.put("user_name", name);
                programs.put(name, baseInfo);
            }
            log.info("=====关闭引用检测前===:{}",JSON.toJSON(programs));
            programs = JSON.parseObject(JSON.toJSONString(programs, SerializerFeature.DisableCircularReferenceDetect));
            log.info("=====多关闭引用检测后===:{}",JSON.toJSON(programs));
        }
    }

输出结果:

可以看到关闭引用检测前:

java 复制代码
{
    "学生一":{
        "user_name":"学生二",
        "class_info":"班级信息"
    },
    "学生二":{
        "$ref":"$.学生一"
    }
}

多关闭引用检测后:

java 复制代码
{
    "学生一":{
        "user_name":"学生二",
        "class_info":"班级信息"
    },
    "学生二":{
        "user_name":"学生二",
        "class_info":"班级信息"
    }
}

很明显JSONObject programs的初始化在循环外边,被认为是一个对象,就出现$ref,而我们最终集合是想放两个学生信息的JSONObject到list里面。所以关闭引用检测即可,当然也可以吧JSONObject初始化放到for循环内,这样就不用关闭检测了。

相关推荐
盖伦发发11 分钟前
Redis 核心教学: 数据结构, 缓存设计, 分布式锁
java·redis·后端·软件工程
卷毛的技术笔记12 分钟前
RocketMQ事务消息:我把分布式事务这层窗户纸捅破了
java·分布式·后端·java-rocketmq
铁皮饭盒25 分钟前
网页端, 40mb离线模型, 自动抠图, 不用 Python,不用服务器,不用 API Key, 不用显卡
前端·javascript·后端
yxlalm25 分钟前
零基础快速上手Trae创建Java项目
java·人工智能
ly768931 分钟前
磁盘 I/O 延迟突增:用 iostat、blktrace 与火焰图定位到具体调用栈
java·linux·前端·数据库·iostat·磁盘 i/o·blktrace
泡海椒35 分钟前
jquick-pdf 核心原理解析:基于 HTML 模板动态渲染 PDF 的实现逻辑
java·开发语言·pdf
IT_陈寒38 分钟前
Redis并发写入踩坑记录:别让超时设置坑了你
前端·人工智能·后端
Bs_MoneyMagnet44 分钟前
基于springboot+vue的图书馆预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·图书管理系统·计算机毕业设计
console.log('npc')1 小时前
03 — 核心框架:App 与中间件
后端·node.js·express
小蒜学长1 小时前
基于小程序的绘画作品创作与分享社区系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·绘画作品·创作分享社区