Tencent / APIJSON

🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构 🏆 Real-Time coding-free, powerful and secure ORM 🚀 providing APIs and Docs without coding by Backend, and the returned JSON of API can be customized by Frontend(Client) users
http://apijson.cn
Other
17.27k stars 2.16k forks source link

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

Closed jia199807 closed 2 months ago

jia199807 commented 2 months ago

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 commented 2 months ago

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

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

TommyLemon commented 2 months ago

只是为了获取分页信息的话,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;

jia199807 commented 2 months ago

测试了一下您给的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

TommyLemon commented 2 months ago

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

jia199807 commented 2 months ago

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

@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);
    }