先说结论:

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问题的更多相关文章

  1. fastjson生成JSON字符串的时候出现$ref

    fastjson生成JSON字符串的时候出现$ref 转载自:http://wuzhuti.cn/201426!826!05!130202.html 可以通过选项 DisableCircularRef ...

  2. 使用fastjson将list、map转换成json,出现$ref

    这是转换时出现的问题情况( map >> json ) 引用是通过"$ref"来表示的 引用 描述 "$ref":".." 上一 ...

  3. FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换

    fastJson对于json格式字符串的解析主要用到了一下三个类: JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换. JSONObject:fas ...

  4. HttpClient 模拟发送Post和Get请求 并用fastjson对返回json字符串数据解析,和HttpClient一些参数方法的deprecated(弃用)的综合总结

    最近在做一个接口调用的时候用到Apache的httpclient时候,发现引入最新版本4.5,DefaultHttpClient等老版本常用的类已经过时了,不推荐使用了:去官网看了一下在4.3之后就抛 ...

  5. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  6. FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换

    当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('g ...

  7. fastJson顺序遍历JSON字段

    fastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用L ...

  8. fastJson顺序遍历JSON字段(转)

    fastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用L ...

  9. 利用阿里巴巴封装的FastJSON来解析json并转换成map

    利用阿里巴巴封装的FastJSON来解析json并转换成map   package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; i ...

随机推荐

  1. 拖动条形图设置任务关联(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 仅仅是知悉了四种任务关联,那只是纸上谈兵,要把这四种关联真正用到Project上才行,所以我们就要来设置任务关联了. 这是 ...

  2. M-SOLUTIONS Programming Contest 2020 题解

    M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...

  3. linux 下查看文件修改时间

    linux 下查看文件修改时间 等 http://blog.sina.com.cn/s/blog_6285b04e0100f4xr.html 查看文件时间戳命令:stat awk.txtFile: ` ...

  4. SpringBoot简单整合Gateway网关

    引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>s ...

  5. c++模板移除引用

    背景 一个函数内部需将函数内的一个变量转为其参数的类型, 函数的参数是引用 本文要演示的环境需要c++11支持(使用了新的关键字 using) 例如 get_value 内部将dobuble类型数据转 ...

  6. Windows库函数获取 可执行程序所在路径

    头文件 #include <Windows.h> 函数 函数已经写好了 std::string get_executable_dir_() { char path[255] = { 0 } ...

  7. qt5之使用QtXlsxWriter库

    note Qt version: 5.12 platform: os x 10.15 本文将介绍直接使用QtXlsxWriter源码 准备 下载QtXlsxWriter 使用Qt Creator 创建 ...

  8. nim_duilib(16)之xml学习实战(GTAV加载窗口实现)

    本文的目标 使用配置xml实现下面的结果 布局 整体采用水平布局,左边显示文字区域设置为垂直布局. lets go stage 1 创建一个空白窗体,并设置为半透明:同时,使得整个窗口可以移动,则 将 ...

  9. 【LeetCode】1404. 将二进制表示减到 1 的步骤数 Number of Steps to Reduce a Number in Binary Representation to One

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 转成十进制模拟 修改二进制字符串 日期 题目地址:ht ...

  10. 【LeetCode】1154. Day of the Year 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计算1月1号之间天数 日期 题目地址:https:// ...