当前位置: 首页 > news >正文

JSON.toJSONString() 解析之后 出现“$ref“:“$[x].xxx“

原因:JSON在处理数据时出现了相同数据,JSON自动将相同节点的数据使用引用方式代替。

解决方式:

String jsonString = JSON.toJSONString(params, SerializerFeature.DisableCircularReferenceDetect);

 SerializerFeature.DisableCircularReferenceDetect:消除对同一对象循环引用的问题

扩展:

 

名称含义
QuoteFieldNames输出key时是否使用双引号,默认为true
UseSingleQuotes使用单引号而不是双引号,默认为false
WriteMapNullValue是否输出值为null的字段,默认为false
WriteEnumUsingToString

Enum输出name()或者original,默认为false

 
1、目前版本的fastjon默认对enum对象使用WriteEnumUsingName属性,因此会将enum值序列化为其Name。
2、使用WriteEnumUsingToString方法可以序列化时将Enum转换为toString()的返回值;同时override toString函数能够将enum值输出需要的形式。但是这样做会带来一个问题,对应的反序列化使用的Enum的静态方法valueof可能无法识别自行生成的toString(),导致反序列化出错。
3、如果将节省enum序列化后的大小,可以将enum序列化其ordinal值,保存为int类型。fastJson在反序列化时,如果值为int,则能够使用ordinal值匹配,找到合适的对象。
fastjson要将enum序列化为ordinal只需要禁止WriteEnumUsingName feature。
首先根据默认的features排除WriteEnumUsingName,然后使用新的features序列化即可。

int features=SerializerFeature.config(JSON.DEFAULT_GENERATE_FEATURE, SerializerFeature.WriteEnumUsingName, false)
JSON.toJSONString(obj,features,SerializerFeature.EMPTY);

UseISO8601DateFormatDate使用ISO8601格式输出,默认为false
WriteNullListAsEmptyList字段如果为null,输出为[],而非null
WriteNullStringAsEmpty字符类型字段如果为null,输出为”“,而非null
WriteNullNumberAsZero数值字段如果为null,输出为0,而非null
WriteNullBooleanAsFalseBoolean字段如果为null,输出为false,而非null
SkipTransientField如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。
默认为true
SortField按字段名称排序后输出。默认为false
WriteTabAsSpecial把\t做转义输出,默认为false
PrettyFormat结果是否格式化,默认为false
WriteClassName序列化时写入类型信息,默认为false。反序列化是需用到
DisableCircularReferenceDetect

消除对同一对象循环引用的问题,默认为false
当进行toJSONString的时候,默认如果重用对象的话,会使用引用的方式进行引用对象。

 [  
      {  
        "$ref": "$.itemSkuList[0].itemSpecificationList[0]"  
      },   
      {  
        "$ref": "$.itemSkuList[1].itemSpecificationList[0]"  
      }  
    ]  
 

循环引用
很多场景中,我们需要序列化的对象中存在循环引用,在许多的json库中,这会导致stackoverflow。在功能强大的fastjson中,你不需要担心这个问题。例如:

A a = new A();  
B b = new B(a);  
a.setB(b);  
String text = JSON.toJSONString(a); //{"b":{"a":{"$ref":".."}}}  
A a1 = JSON.parseObject(text, A.class);  
Assert.assertTrue(a1 == a1.getB().getA());  
 

引用是通过"$ref"来表示的

引用描述

  • "$ref":".."  上一级
  • "$ref":"@"   当前对象,也就是自引用
  • "$ref":"$"   根对象
  • "$ref":"$.children.0"   基于路径的引用,相当于 root.getChildren().get(0)
WriteSlashAsSpecial对斜杠’/’进行转义
BrowserCompatible将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
WriteDateUseDateFormat全局修改日期格式,默认为false。
JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
DisableCheckSpecialChar一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
NotWriteRootClassName含义
BeanToArray将对象转为array输出
http://www.lryc.cn/news/178065.html

相关文章:

  • 2023研究生数学建模E题思路+模型+代码+论文(持续更新中) 出血性脑卒中临床智能诊疗建模
  • 云可观测性安全平台——掌动智能
  • [ruby on rails] postgres sql explain 优化
  • YOLOv7改进:GAMAttention注意力机制
  • 83、SpringBoot --- 下载和安装 MSYS2、 Redis
  • 用css画一个半圆弧(以小程序为例)
  • redis介绍
  • 数学建模常用模型
  • Linux 基本语句_5_创建静态库|动态库
  • 【每日一题】2703. 返回传递的参数的长度
  • 虚拟DOM详解
  • Linux配置命令
  • Kafka:介绍和内部工作原理
  • 在 EMR Serverless 上使用 Delta Lake
  • Stream流的使用详解(持续更新)
  • golang工程——gRpc 拦截器及原理
  • Python接口自动化之unittest单元测试
  • 在亚马逊云科技Amazon SageMaker上部署构建聊天机器人的开源大语言模型
  • 【51单片机】10-蜂鸣器
  • 26377-2010 逆反射测量仪 知识梳理
  • css实现渐变电量效果柱状图
  • FileManager/本地文件增删改查, Cache/图像缓存处理 的操作
  • vue中使用富文本编辑器
  • 13.(开发工具篇github)如何在GitHub上上传本地项目
  • vue3中状态适配
  • uniapp h5 端 router.base设置history后仍有#号
  • 上网行为监管软件(上网行为管理软件通常具有哪些功能)
  • C#中的for和foreach的探究与学习
  • 【ES6知识】Promise 对象
  • 【Git】配置SSH密钥实现Git操作免密