客户端不接收 null, 各位服务端大佬都是怎么优雅处理的?

2024-01-29 16:12:07 +08:00
 laaaaaa

环境

jdk8, springboot;

需求

客户端包括了很多,电视端 手机端 小程序端 web 端;

除了 web 端,好像都不太愿意接收 null ;

例如 java 一个实体类 我返回给他们,某些字段为空的话 也想接收 "",不要 null ;


这一块我想问问大佬们,都是怎么优雅处理的;

不会要每个 bean ,都 private String a = "";

ps

 1. 判断 Null  和 "" 有很大区别吗? 因为什么呢
 2.java 编译过程中,null 要比""占用的资源少吧
5489 次点击
所在节点    程序员
73 条回复
a5X77vajGRyLA2aF
2024-01-31 09:57:55 +08:00
1. null 和默认值是两个概念,null 是没有值,判 null 是调用方的责任
2. 字段能否为 null ,是产品,业务决定的,如果有默认值,也是产品和业务决定的。
3. 字段为 null ,或者为 null 时不返回字段,前端处理不了的,领导还倾向前端的,只能对你表示可怜
liuhuihao
2024-01-31 10:48:34 +08:00
个人观点

String 空值情况:空值一律返回'',理由是一般情况下字符串字段都是用来展示用的,如有逻辑判断<用户是否填了>这个字段,那可以增加一个 boolean 字段表示是否填了, 但这种情况业务上很少,因为作为入参的时候一个输入框没填其实 = 空字符串

Number 空值需要根据业务场景来处理,比如“好友数”等各种计数的空值可以是 0 ,男女等 未选择的话可以用 -1 表示。但如果是一个非必填数字输入框,可以输入任意值的这种,null 值 应该是需要的

Boolean 同 Number ,需要根据业务场景来处理。

Array 空值一律应为 []

Object 不应返回 null ,比如“人”这个对象有个字段叫“父亲信息”,有的人可能没有父亲,这种情况 “父亲信息” 字段不应返回 null ,而是在“父亲信息”这个对象里面的 “是否存在父亲”字段做判断

总结我的观点:除了 Number 和 Boolean 可以返回 null ,字符串、对象、数组都不应返回 null
liuhuihao
2024-01-31 10:58:18 +08:00
@yusheng88 产品和业务决定的应该是 字段是否可以为空,帖子讨论的为空的时候接口是否该返回 null 。很多值为空时候返回其实是可以在接口设计阶段避免的。
个人理解,如字符串 null 和'' 其实是一个含义都表示没填,数组[] 和 null 其实也是一个含义都表示没有。对象则应该在对象内部增加字段判断是否存在,Number 和 Boolean 大多数情况下也不需要返回 null 。
QlanQ
2024-01-31 11:14:06 +08:00
我比较赞同 #58 的观点
接口的基本原则就是 数据结构必须一致,如果你的这个数据定义是 string 那这个值没有设置之前都是 '',不应该是 null
上面有说 如果是 null 就不返回的情况,这种我见了就直接打,你都是强类型语言了,返回的结构还不一样?我在判断一个数据的值是不是真之前,还要考虑这个值存不存在?

两个例子,现在已经有 1w 用户了,突然加了个需求,用户可以弄一个签名,类似 QQ 签名,这个时候,你要加表字段,按楼上一些人说的,那这个用户没有设置过,值应该是 null 是吧,那现在一个用户设了签名,后面又清空了签名,那你在保存用户的签名时候,是改成空字符还是 null ?你返回的数据是什么?

上面提到年龄,如果这个字段的信息是保存用户的年龄,那 null 是什么意思呢?
liuhuihao
2024-01-31 11:37:58 +08:00
数据定义和返回必须一致,这个我支持。你可以看下 我 62 楼的回复,有些情况下 null 还是有必要的。比如一个非必填输入框只支持填写任意的数字,那么这种情况下 我这边通常在定义这个字段的时候就定义为 number | null ,用 null 来表示“没有填”。
xingdaorong
2024-01-31 11:42:06 +08:00
@zjsxwc 没听懂啥意思,这个是否被改写的状态真实业务场景的状态是啥,很多不需要这个字段
a5X77vajGRyLA2aF
2024-01-31 12:44:34 +08:00
@liuhuihao
1. 我的评论应该很清楚,接口该返回 null 就返回 null
2. null 和"不是一个东西,等你什么时候调用接口后不用对 string 返回值判 null 再讨论这个吧。
3. 集合,容器类推荐返回空集合,因为关注的是容器内的元素,而不是容器,容器应该存在的
liuhuihao
2024-01-31 15:05:41 +08:00
@yusheng88 #67 没理解你的意思。我们这边接口针对 string 、数组、对象 类型前端确实是不需要 判 null 的,因为约定的是啥类型返回就是啥类型,空值也一样,string 类型为空时当然应该为空字符串,null 又不是字符串类型,类型定义和数据返回的类型应该一致。
jones2000
2024-01-31 15:15:39 +08:00
null 字段,直接不要返回就不可以了, 还能节省流量。
a5X77vajGRyLA2aF
2024-01-31 15:23:59 +08:00
@liuhuihao
话不投机半句多
你保持你的接口返回值没有 null 就行了。
不用再回复,没兴趣解答。
lancelock
2024-01-31 17:56:43 +08:00
空数字是各什么概念,哪个数字是空的?
Coder89757
2024-01-31 18:11:14 +08:00
@doco #1 主要原因是给了 null 之后,解构取值兜底逻辑会直接失效。。。

```javascript
const { str = '' } = response;
// 假如 str 直接不存在,对象中连这个属性 key 都没有,前端拿到的 str 就是 undefined ,此时会兜底成空字符串,下面这个语句会正常运作,UI 正常渲染
const newStr = str.replace('foo', 'bar');
// 假如 str 传了 null ,这里直接 error 了,假如这段逻辑在 React 或者 Vue 渲染逻辑里面,这块 UI 直接就白了
```

核心问题还是在于,这种做法改变了返回字段的类型,把前端或者客户端,抛进了类型判断的屎山地狱
DzwsGo
2024-02-01 14:54:03 +08:00
@chendy
#46
说的很对,但是答非所问,自己的逻辑 null 很好处理,但是接口里如果冷不丁返回 null 的话,做处理就会所有的参数都加上?,不做处理转对象的时候就会崩。
#9
这跟 ui 框架没有关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1012490

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX