循环给JSONObject赋值出现“ r e f ”:“ ref”:“ ref「0」”如何解决

问题描述

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

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

FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。

用法:JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
在这里插入图片描述
例如:

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

关闭引用前

{
    "学生一":{
        "user_name":"学生二",
        "class_info":"班级信息"
    },
    "学生二":{
        "$ref":"$.学生一"
    }
}

关闭引用后

{
    "学生一":{
        "user_name":"学生二",
        "class_info":"班级信息"
    },
    "学生二":{
        "user_name":"学生二",
        "class_info":"班级信息"
    }
}

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

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐