客户端不接收 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 要比""占用的资源少吧
5436 次点击
所在节点    程序员
73 条回复
mshadow
2024-01-30 00:27:34 +08:00
@pota {}给[],一般是后端 php 的坑,map 和数组在 php 中都是 array ,空 array 会 json 序列化为[],这个一般要 php 特殊处理一下
oatw
2024-01-30 08:52:37 +08:00
有一种主义叫“无 null 主义”,数据库里就不可以有 null ,尤其是涉及到三值逻辑的时候。
DzwsGo
2024-01-30 09:02:45 +08:00
kotlin 默认非空,如果没有做特殊处理 json 转换的时候遇到 null 就会崩溃,做处理就会出现很多?
另外
@chendy #9 后端是不是可以换个完善点的框架,自动把 null 换成相应数据类型默认值? 😁
pota
2024-01-30 09:14:29 +08:00
@laaaaaa #7 java 应该没有这个问题吧? map 结构化之后就是{}啊。像楼上说的,PHP 会有这个问题。API 数据类型一致因为我不是 java ,一般我解决方案就是可能出现类型不一致的定义 Attribute 获取
cleveryun
2024-01-30 09:32:13 +08:00
前面有楼层提到数值没值返回 0 不合适时返回 null 的。这个没业务场景的情况下且认为没问题。这里其实他们说的最大问题不是是否返回 null ,而是与接口文档是否一致。如果会返回 null ,那接口文档里就不应该只写会返回数值,应该把 null 也写上。这是联调涉及到的契约精神的问题,不应该字段值类型都变成盲盒。
chendy
2024-01-30 09:37:20 +08:00
@DzwsGo 写过 kt 和 ts ,需要?的时候就给?呗,业务逻辑允许 null ,代码没理由不允许 null (其实展示层还好,如果有逻辑啥的就比较麻烦,有时候甚至原样复制粘贴但是去掉?然后加校验和报错)
这么一说其实塞默认值可能在序列化这一步更合适?
字符串就 "",列表就 [],但是对象和数字不好处理,特别是需要区分‘填了’和‘没填’,需要有‘草稿’这类的功能的时候更是如此…
j1132888093
2024-01-30 09:47:46 +08:00
整型的 null 和 0 ,字符串的 null 和空本来就是不同的意义,凭啥不要 null ?你要是说 null 就直接不返回这个字段还能理解
wangtian2020
2024-01-30 09:47:54 +08:00
返回的 json 出现 null 或者是 undefined 我立马活都不干了跟后端去 battle ,所有字段必须初始化成空字符串/空数字
2123123
2024-01-30 10:40:38 +08:00
字符串空跟 null 的绝大部分时候意义是一样的,所以字符串我一般初始值给 ""
但是空数字意义是不一样的,非要传个特定数字或者 "" 代表空的话也要多一次判断,跟判断一次 null 本质上不是一样吗?
leonshaw
2024-01-30 11:01:44 +08:00
幼儿园就讲过的问题,0 不一定是没有,白色不等于透明
jl1014171068
2024-01-30 11:02:07 +08:00
null 也还能接受,但是还有返回"null"的..........
dyv9
2024-01-30 12:49:24 +08:00
对于数字栏,有时候没填写和 0 意思是不一样的。
BBCCBB
2024-01-30 13:11:20 +08:00
OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);

这样直接就不返回那个值了, 一样有问题.
最好的办法就是前端判断..
xingdaorong
2024-01-30 15:44:29 +08:00
@zjsxwc 你说的不合理,假如 age 字段不填,可以返回 null 不能 0,因为含义不同一个没有年纪,一个是 0 岁,字符串比如名字,可以是 null 可以是"",但是最好是"",因为前端可能用字符串方法不做判空报错。但是比如一个数组,没有数据就是空数组[]而不是 null 。总结:如果没有特殊含义就一定用同类型的,不用 null 。
exmario
2024-01-30 16:11:57 +08:00
null 还好说,但是给个"null"算什么回事
zjsxwc
2024-01-30 16:34:25 +08:00
@xingdaorong
我还是坚持除了 array 必须用空数组[]外,别的全都可以 null 。

如果你不允许 null ,那么对于任意字段 XXX ,你必须额外添加一个字段 isXXXNotNull 来表示,XXX 字段是没有被填写状态还是已经被填写了。
lujiaosama
2024-01-30 16:46:24 +08:00
我最讨厌的是数字型字段原本该返回 NULL 或者''. 给我返回了个-1. 问题是-1 有些场景在业务上是有意义的. 直接显示个-1 容易误导用户.
wmui
2024-01-30 18:39:41 +08:00
不是不能是 null ,是要保持数据结构一致。如果是数字,默认值可以是 0 不能是 null ,如果是字符串,默认值可以是'',如果是对象,默认值可以是 null
zerofancy
2024-01-31 03:27:11 +08:00
我们是基本类型一般不要有 null ,这样客户端可以定义 int 而不是 Integer 。其他类型包括 String 都当作可能为 null 来处理。
尽管我们用了 Kotlin ,但序列化框架还是 gson ,所以一般还是把几乎所有字段定义成可空的。
Jhon11
2024-01-31 07:28:57 +08:00
用 protobuf

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

https://ex.noerr.eu.org/t/1012490

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

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

© 2021 V2EX