1. 遇到的问题
{ "errMsg": "", "data": { "baseinfo": { "freeTest": "0", "request": "1", "format": "2", "url": "rttt" }, "backSample": { "backSample": "" }, "errCode": [ { "sid": "2", "orderVal": "2", "wrequired": "g", "code": "mm", "fieldId": "2", "wdefault": "sdf", "codeDesc": "erfrgt", "inOut": "1", "name": "efed", "wdesc": "dfdws", "typ": "int" }, { "sid": "1", "orderVal": "2", "wrequired": "g", "code": "dd", "fieldId": "2", "wdefault": "sdf", "codeDesc": "edfd", "inOut": "1", "name": "efed", "wdesc": "dfdws", "typ": "int" } ], "params": [ { "$ref": "$.data.errCode[0]" }, { "sid": "2", "orderVal": "1", "wrequired": "d", "code": "mm", "fieldId": "1", "wdefault": "eddf", "codeDesc": "erfrgt", "inOut": "1", "name": "eed", "wdesc": "dfds", "typ": "int" } ] }, "code": "0" }
今天在开发过程中,使用POSTMAN调试接口时出现以上问题
"$ref": "$.data.errCode[0]"
2. 解决方案
DisableCircularReferenceDetect来禁止循环引用检测:
JSON.toJSONString(..., SerializerFeature.DisableCircularReferenceDetect)
采用的一个对象,整个list列表中每个元素有一个对象元素,如果第二个元素中有一个与第一个元素中对象同名的,就会去引用上一个元素的地址,在json前台解析的时候就不会解析出来相应对象的数据,当进行toJSONString的时候,默认如果重用对象的话,会使用引用的方式进行引用对象。
3. 剖析
引用是用“$ref”来表示的
引用 | 描述 |
"$ref":".." | 上一级 |
"$ref":"@" | 当前对象,也是自引用 |
"$ref":"$" | 根对象 |
"$ref":"$.children.0" | 基于路径的引用,相当于 root.getChildren().get(0) |
3. 前端解决方案
FastJson.format(data); //data是后台返回的json数据,里面有$ref字样的字符串,这是前面所说的fastjson处理的,但是通过这句话都能进行替换,把我们需要的数据还原回来