APIJSON icon indicating copy to clipboard operation
APIJSON copied to clipboard

[Bug] "info@":"/[]/info"返回异常

Open jia199807 opened this issue 1 year ago • 2 comments

APIJSON Version/APIJSON 版本号

7.0.3

Database Type & Version/数据库类型及版本号

MySQL 8.3.0

Environment/环境信息

- JDK/基础库:corretto-17.0.9
- OS/系统:Win10

APIAuto Screenshots/APIAuto 请求与结果完整截屏

上传失败 后续补充

Current Behavior/问题描述

{
    "[]": {
        "query": 2,
        "User": {}
    },
    "info@": "/[]/info"
}
之前的版本是从info中读取分页信息,升级后变为,没有正确显示分页信息。
"info": {

    "$ref": "$.listInfo" 

},

Expected Behavior/期望结果

兼容旧版读取方式:既可以从info中读取,也可以从listInfo中读取

Any additional comments?/其它补充说明?

7.0.0未出现该问题

jia199807 avatar Aug 23 '24 02:08 jia199807

APIAuto 请求与结果完整截屏 7 0 3

APIAuto 请求与结果完整截屏 7 0 0

jia199807 avatar Aug 23 '24 02:08 jia199807

只是为了获取分页信息的话,info@ 可以不传了,直接用 listInfo。

如果一定要自定义字段,有几种简单方式: 1.客户端也用 fastjson 或者其它支持 $ref 这个引用解析语法的 JSON 库;

2.后端 fastjson 设置去除 $ref: 单独设置(DemoController get 等方法内) JSON.toJSONString(menujson, SerializerFeature.DisableCircularReferenceDetect); 全局设置(不推荐,性能差) JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();

3.传参特定 "key": value 或 "key@": value,key 为 listTotal, listInfo,value 可以是任何值,建议 null;

TommyLemon avatar Aug 24 '24 14:08 TommyLemon

测试了一下您给的3种方法都可行。 由于前端项目已完结,查询语句不便更改,采用以下方式兼容旧版。

    @PostMapping(value = "get")
    @Override
    public String get(@RequestBody String request, HttpSession session) {
        // 通过new JSONObject的方式,在不关闭引用检测的情况下避免$ref
        String result = super.get(request, session);

        JSONObject jsonObject = JSON.parseObject(result);

        JSONObject info = jsonObject.getJSONObject("info");

        if (info != null) {
            jsonObject.put("info", new JSONObject(info));
        }

        // 返回更新后的 JSON 字符串
        return jsonObject.toJSONString();
    }

效果: image

jia199807 avatar Aug 26 '24 06:08 jia199807

推荐以上方式 2,不只是这一个问题,还能解决其它同类问题。 你的这段代码只能兼容 key 为 info@ 的,如果欢乐 pageInfo@ 等其它 key 就得再加代码处理

TommyLemon avatar Sep 01 '24 14:09 TommyLemon

好的,已更换下面的方式,效果相同

@PostMapping(value = "get")
    @Override
    public String get(@RequestBody String request, HttpSession session) {
        String result = super.get(request, session);

        JSONObject jsonObject = JSON.parseObject(result);

        return JSON.toJSONString(jsonObject, SerializerFeature.DisableCircularReferenceDetect);
    }

jia199807 avatar Sep 12 '24 09:09 jia199807