zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/tutubaobao/p/9760524.html
Copyright © 2011-2022 走看看