问题描述:
项目中用到了 fastjson ,恰巧在做一个复杂的对象转化,用postman 调用时
返回结果正常解析。但是 调用 pop 接口生成blink 任务的时候,里边的格式除出现 $ref 的问题。

分析:
引用标识说明:


“$ref”:”..” 上一级
“$ref”:”@” 当前对象,也就是自引用
“$ref”:”$” 根对象
{"$ref":"../.."} 引用父对象的父对象
“$ref”:”$.children.0” 基于路径的引用,相当于root.getChildren().get(0)
1
2
3
4
5
6
解决办法:
方案一  局部生效
 关闭检查:
JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);

1
2
3
4
总结注意
避免重复引用序列化时显示$ref

在编码时,使用新对象为集合或对象赋值,而非使用同一对象
不要在多处引用同一个对象,这可以说是一种java编码规范,需要时刻注意。
不要关闭FastJson的引用检测来避免显示r e f 引 用 检 测 是 F a s t J s o n 提 供 的 一 种 避 免 运 行 时 异 常 的 优 良 机 制 , 如 果 为 了 避 免 在 重 复 引 用 时 显 示 ref 引用检测是FastJson提供的一种避免运行时异常的优良机制,如果为了避免在重复引用时显示ref引用检测是FastJson提供的一种避免运行时异常的优良机制,如果为了避免在重复引用时显示ref而关闭它,会有很大可能导致循环引用时发生StackOverflowError异常。这也是FastJson默认开启引用检测的原因。

避免重复/循环引用的正确姿势

1、重复引用
可以向上面的代码一样,创建新的对象,把要有重复需要的对象的属性复制给新对象,新对象再添加到json那里。
2、循环引用
循环引用这种逻辑本身就不合理,需要在编码时注意避免,这是逻辑错误而非编码技巧。

SerializerFeature常用属性

名称 含义
QuoteFieldNames 输出key时是否使用双引号,默认为true
UseSingleQuotes 使用单引号而不是双引号,默认为false
WriteMapNullValue 是否输出值为null的字段,默认为false
WriteEnumUsingToString Enum输出name()或者original,默认为false
UseISO8601DateFormat Date使用ISO8601格式输出,默认为false
WriteNullListAsEmpty List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty 字符类型字段如果为null,输出为”“,而非null
WriteNullNumberAsZero 数值字段如果为null,输出为0,而非null
WriteNullBooleanAsFalse Boolean字段如果为null,输出为false,而非null
SkipTransientField 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
SortField 按字段名称排序后输出。默认为false
WriteTabAsSpecial 把\t做转义输出,默认为false不推荐设为true
PrettyFormat 结果是否格式化,默认为false
WriteClassName 序列化时写入类型信息,默认为false。反序列化是需用到
DisableCircularReferenceDetect 消除对同一对象循环引用的问题,默认为false
WriteSlashAsSpecial 对斜杠’/’进行转义
BrowserCompatible 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
WriteDateUseDateFormat 全局修改日期格式,默认为false。
DisableCheckSpecialChar 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
BeanToArray 将对象转为array输出

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

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

更多推荐