一、问题描述
{
"schema": {
"originalRef": "Result«object»",
"$ref": "#/definitions/Result«object»"
}
}
入参字符串是json格式,可直接转为JSONObject,由于某个字段是$ref
,导致调用fastjson的JSON.parseObject(String text)方法出现问题。
1、问题一:$ref
在第一个字段,转化api报错:
com.alibaba.fastjson.JSONException: syntax error
2、问题二:$ref
在第二个字段,则转化api未报错,但是同级所有字段全部消失,只留下$ref
这个字段,且值变为@:
注意:若返回转化后的json给前端,则会报错:Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: 统一返回响应类路径)
二、解决思路
从报错情况和fastjson使用经验判断,$ref
是fastjson声明引用属性名,相当于内置字段,外来字段重名会导致转化逻辑。所以考虑处理"引用"这个问题。
三、解决方案
使用转化规则DisableCircularReferenceDetect,即关闭引用。最终代码:
JSON.parseObject(text, Feature.DisableCircularReferenceDetect);
四、小结
1、使用$ref
作为入参字段会影响fastjson转化逻辑,需要使用Feature.DisableCircularReferenceDetect转化规则处理;
2、JSON.parseObject(text, Feature.DisableCircularReferenceDetect),转化规则在1.2.24版本并未生效,1.2.39+版本才生效,1.2.24-1.2.39之间的版本暂未测试。