fastjson字符串转JSON的$ref问题
先说结论:
fastjson在把对象转换成字符串的时候,如果遇到相同的对象的时候,默认开启引用检测将相同的对象写成引用的形式。
官网文档:https://github.com/alibaba/fastjson/wiki
问题出现的背景:
在开发过程中,使用了第三方的拓扑图组件。组件生成图形的json字符串在利用 fastjson 转换成 JSON 对象的时候报错如下所示:
Exception in thread "main" com.alibaba.fastjson.JSONException: illegal ref, int
后来定位到如下的字符串解析的时候会出错:
public class test {
public static void main(String[] args) {
String str1 = "{\"$position\":{\"$ref\":21}}";
String str2 = "{\"position\":{\"ref\":21}}";
JSONObject json = JSONObject.parseObject(str1);
}
}
解析str2没问题,解析str1报错 Exception in thread "main" com.alibaba.fastjson.JSONException: illegal ref, int
刚开始判断是$符号是特殊符号导致,所以去掉后解析str2没问题。
后来又测试下去掉第一个$
String str1 = "{\"position\":{\"$ref\":21}}";
还是报错:Exception in thread "main" com.alibaba.fastjson.JSONException: illegal ref, int
那么问题出现在第二个$ref
上了。那么怀疑$ref 就好像保留字段一样,不能使用,于是修改为
String str1 = "{\"position\":{\"$reff\":21}}";
那么调用JSONObject.parseObject(str1);
果然就正常了。
查阅官网资料:fastjson支持循环引用,并且是缺省打开的。
如果有相同的对象,那么 fastjson 会默认开启引用模式。
语法 | 描述 |
---|---|
{"$ref":"$"} | 引用根对象 |
{"$ref":"@"} | 引用自己 |
{"$ref":".."} | 引用父对象 |
{"$ref":"../.."} | 引用父对象的父对象 |
{"$ref":"$.members[0].reportTo"} | 基于路径的引用 |
官网还给出了说明:
当序列化后的JSON传输到浏览器或者其他语言中,这些json解析器不支持循环引用,从而导致数据丢失。你可以关闭fastjson的循环引用支持。关闭引用检测,还能够提升序列化时的性能。
全局配置关闭
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
非全局关闭
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
综上,我们的字符串中包括"$ref",fastjson 认为这是引用模式,但是引用的值又是不正确的,导致出错。
解决方式上面说了两种,一种全局,一种非全局的。
我们采用非全局的,那么下面的代码就是正确的了
public class test {
public static void main(String[] args) {
String str1 = "{\"$position\":{\"$reff\":21}}";
JSONObject json = JSONObject.parseObject(str1, Feature.DisableCircularReferenceDetect);
System.out.println(json);
}
}
结果:
{"$position":{"$reff":21}}
fastjson字符串转JSON的$ref问题的更多相关文章
- fastjson生成JSON字符串的时候出现$ref
fastjson生成JSON字符串的时候出现$ref 转载自:http://wuzhuti.cn/201426!826!05!130202.html 可以通过选项 DisableCircularRef ...
- 使用fastjson将list、map转换成json,出现$ref
这是转换时出现的问题情况( map >> json ) 引用是通过"$ref"来表示的 引用 描述 "$ref":".." 上一 ...
- FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
fastJson对于json格式字符串的解析主要用到了一下三个类: JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换. JSONObject:fas ...
- HttpClient 模拟发送Post和Get请求 并用fastjson对返回json字符串数据解析,和HttpClient一些参数方法的deprecated(弃用)的综合总结
最近在做一个接口调用的时候用到Apache的httpclient时候,发现引入最新版本4.5,DefaultHttpClient等老版本常用的类已经过时了,不推荐使用了:去官网看了一下在4.3之后就抛 ...
- java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法
1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...
- FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换
当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...
- fastJson顺序遍历JSON字段
fastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用L ...
- fastJson顺序遍历JSON字段(转)
fastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用L ...
- 利用阿里巴巴封装的FastJSON来解析json并转换成map
利用阿里巴巴封装的FastJSON来解析json并转换成map package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; i ...
随机推荐
- vue3官网介绍,安装,创建一个vue实例
前言:这一章主要是vue的介绍.安装.以及如何创建一个vue实例. 一.vue介绍 vue3中文官网:建议先自己看官网. https://v3.cn.vuejs.org/ vue是渐进式框架,渐进式指 ...
- Google Earth Engine 中的位运算
Google Earth Engine中的位运算 按位运算是编程中一个难点,同时也是在我们后续处理影像数据,尤其要使用影像自带的波段比如QA波段经常会用到的一个东西.通过按位运算我们可以筛选出我们想要 ...
- Django ModelForm表单验证
ModelForm 在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去From中字段的定义 应用场景:定制model admin 的时候可以使用.适用于小业 ...
- NLTK 3.2.5 documentation Installing NLTK
Installing NLTK NLTK requires Python versions 2.7, 3.4, or 3.5 Mac/Unix Install NLTK: run sudo pip i ...
- C++之面试题(4)
题目描述 来源:牛客网 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素. 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在 ...
- ubuntu(Linux) c++ 获取本机IPv4和ipv6、查询本机IPv4,IPv6
1.关于 演示环境: Linux xxxxxxx 5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x86_64 x86_64 x ...
- 【LeetCode】面试题 01.07. 旋转矩阵
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 两次翻转 日期 题目地址:https://leetco ...
- 【LeetCode】666. Path Sum IV 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...
- Python实现北邮人论坛模拟登录
推荐去我的博客里查看这篇文章,效果更佳: http://fuxuemingzhu.cn/2017/08/12/byrbbs-login/ 模拟登录北邮人论坛可能是每个学着写爬虫的北邮人必备技能了.在网 ...
- 【LeetCode】3. Longest Substring Without Repeating Characters 无重复字符的最长子串
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:无重复字符,最长子串,题解,leetcode, 力扣,py ...