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.29k stars 2.16k forks source link

查询不到数据,期望出参返回key,value为空,而不是什么都不返回怎么设置呢? #739

Closed gxmanito closed 2 months ago

gxmanito commented 5 months ago

APIJSON Version/APIJSON 版本号

6.1.0

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

MySQL8

Environment/环境信息

- JDK/基础库:1.8
- OS/系统:Linux centos7/window10

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

有数据正常返回 image 查询不到数据时,期望返回每个key,而不是像这样什么都不返回 image

Current Behavior/问题描述

有数据正常返回
![image](https://github.com/Tencent/APIJSON/assets/31918243/a92bd994-a7ad-4369-9034-a20d699fa514)
查询不到数据时,期望返回每个key,而不是像这样什么都不返回
![image](https://github.com/Tencent/APIJSON/assets/31918243/74811ad8-d5dd-4a07-aef2-b1c3136724da)

Expected Behavior/期望结果

No response

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

No response

TommyLemon commented 5 months ago

用 SQL 函数 ifnull "@column":"id;ifnull(type,0):type"

或者写 APIJSON 远程函数并调用: "type()":"getWithDefault(type,0)"

gxmanito commented 5 months ago

单个字段为空可以这样,如果DeviceType查询不到数据时,连DeviceType:{} 都不会返回的,只有 code码、msg等信息

TommyLemon commented 5 months ago

对象内只要有一个字段不为 null,就会返回这个对象,简单试试就知道的事情,先试了再说

gxmanito commented 5 months ago

我试过了,项目中自己在使用了,对象内只要有一个字段不为 null,确实会返回这个对象,但是如果所有字段都是null,整个对象就不返回了,前端反映要求把整个对象字段都要返回,只不过每个字段都是null或者空字符串

TommyLemon commented 5 months ago

这个要求很不合理,一般用传统方式也一样是对象内没有有效字段就不返回整个对象的。 前端应该自己判空,不能依赖后端传这种无效数据,否则不方便判断 是 查不到值 还是 查到值但为 null, 本来 if (对象 != null) { // UI 绑定数据逻辑 } 就可以简单判断,现在要先拿到对象,再对比里面的具体值来判断了。

而且按这种做法,一般几层嵌套的数据,会返回大量无效的数据,还浪费带宽和流量,减慢传输速度。

{
    "Comment": {
        "id": null,
        "userId": null,
        "content": ""
        ...
    },
    "User": {
        "id": null,
        "name": "",
        "contactIdList": [],
        "pictureList": []
        ...
    },
    "Comment:reply": {
        "id": 0,
        "userId": 0,
        "content": ""
    },
    "User:reply": {
        "id": 0,
        "name": "",
        "contactIdList": [],
        "pictureList": []
    },
    ...
    "ok": true,
    "code": 200,
    "msg": "success"
}

这还只是单层,想想多层嵌套得多恶心

gxmanito commented 5 months ago

你说的确实有道理,那我再和前段沟通一下,如果单个字段为空也需要返回的话,除了ifnull函数和远程函数之外我是否可以全局设置直接改fastjson序列化方式,为空也返回呢

image打算在这改返回值的,但是这个方法返回的是JSONObject,fastjson又没有方法可以指定返回值是JSONObject类型的序列化方法,所以目前没找到好的方式来设置出参序列化方式

TommyLemon commented 4 months ago

可以设置 fastjson 返回 null,但 parseResponse 返回的类型是 JSONObject,明显不能这样,改 parse 方法就行。 或者每个万能通用接口 Controller 的方法处理下