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


    1.今天定义了一个JSONObject对象,引用的com.alibaba.fastjson.JSONObject,循环给这个对象赋值出现"$ref":"$[0]"现象,

    /**
     * fastjson中$ref对象重复引用问题
     * 
     * 介绍:
     * FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测。
     * 关闭引用检测后,重复引用对象时就不会被$ref代替,但是在循环引用时也会导致StackOverflowError异常。
     * 
     * 用法:
     * JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
     */

    一个集合中,给相同的对象循环赋值时,它会认为是一个对象,就出现$ref
    举例:
     1 2 
     3 import com.alibaba.fastjson.JSONArray;
     4 import com.alibaba.fastjson.JSONObject;
     5 
     6 public class test {
     7 
     8     public static void main(String[] args) {
     9         JSONObject json = new JSONObject();
    10         JSONArray array = new JSONArray();
    11         for(int i=0;i<3;i++){
    12             json.put("id",i);
    13             array.add(json);
    14             System.out.println(array);
    15         }
    16         System.out.println(array);
    17     }
    18 }
    上面的例子就会出现这个现象。(但是如果把JSONObject json = new JSONObject();放到for循环之内就不会出现,因为每次循环都会新建一个对象,彼此不一样)

    正确的做法之一为,关闭检测,更改之后,
     1  2 
     3 import com.alibaba.fastjson.JSON;
     4 import com.alibaba.fastjson.JSONArray;
     5 import com.alibaba.fastjson.JSONObject;
     6 import com.alibaba.fastjson.serializer.SerializerFeature;
     7 
     8 public class test {
     9 
    10     public static void main(String[] args) {
    11         JSONObject json = new JSONObject();
    12         JSONArray array = new JSONArray();
    13         for(int i=0;i<3;i++){
    14             json.put("id",i);
    15             String str = JSON.toJSONString(json, SerializerFeature.DisableCircularReferenceDetect);
    16             JSONObject jsonjson = JSON.parseObject(str);
    17             array.add(jsonjson);
    18             System.out.println(array);
    19         }
    20         System.out.println(array);
    21     }
    22 }

    这个SerializerFeature.DisableCircularReferenceDetect就是关闭引用检测,就不会出现$ref了

    2.当然也可以吧JSONObject初始化放到for循环内,这样就不用关闭检测了。

    操作网址:https://www.cnblogs.com/zj0208/p/6196632.html

    自己的思路做个记录,如果侵权,请联系删除

  • 相关阅读:
    ubuntu下 apt-get install 下载的文件存放的目录
    ubuntu 上更新安装 openoffice.org3的过程
    ubuntu中flash的中文乱码解决方法
    ubuntu 安装AMP环境的笔记 Prefork方式与fast-cgi方法
    socket 基础知识
    php 处理透明背景的图片时的问题
    RHEL 8 Speculation
    心之力
    (OK) 在内核中,获得 某目的地址的下一跳的数目,kernel 4.4
    Linux内核分析
  • 原文地址:https://www.cnblogs.com/tutubaobao/p/9760524.html
Copyright © 2020-2023  润新知