转为json出现$ref
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
一、json转换出现的问题
public static void main(String[] args) {
List<Map<String, Integer>> detailList = new ArrayList<>();
Map<String, Integer> exceptionMap = new HashMap<>();
for (int i = 0; i < 2; i++) {
exceptionMap.put("code",i);
exceptionMap.put("message", i+5);
detailList.add(exceptionMap);
}
System.out.println(detailList);
System.out.println(JSON.toJSONString(detailList));
}
结果为:
二、分析原因
- 实体转化为json字符串后出现了$ref字样的东西,这是因为在传输的数据中出现相同的对象时,fastjson默认开启引用检测将相同的对象写成引用的形式
-
引用是通过"$ref"来表示的
引用 描述 "$ref":".." 上一级 "$ref":"@" 当前对象,也就是自引用 "$ref":"$" 根对象 "$ref":"$.children.0" 基于路径的引用,相当于 root.getChildren().get(0) - 引用分为两种,重复引用和循环引用
-
重复引用
- 指一个对象重复出现多次
-
循环引用
- 指你心里有我,我心里有你(互相引用),这个问题比较严重,如果处理不好就会出现StackOverflowError异常
三、解决方法
重复引用的解决方法;
1.单个关闭 JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
2.全局配置关闭 JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
循环引用的解决方法:
1.如果你前端用不到这个属性在该属性的get方法上加上注解@JSONField(serialize=false),
2.这样该属性就不会被序列化出来,这个也可以解决重复引用
3.修改表结构,出现循环引用了就是一个很失败的结构了,不然准备迎接StackOverflowError异常
示例:
public static void main(String[] args) {
List<Map<String, Integer>> detailList = new ArrayList<>();
Map<String, Integer> exceptionMap = new HashMap<>();
for (int i = 0; i < 2; i++) {
exceptionMap.put("code",i);
exceptionMap.put("message", i+5);
detailList.add(exceptionMap);
}
System.out.println(detailList);
System.out.println(JSON.toJSONString(detailList, SerializerFeature.DisableCircularReferenceDetect));
}
结果
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e
3 个月前
8c391e04
6 个月前
更多推荐
已为社区贡献2条内容
所有评论(0)