客户端不接收 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 要比""占用的资源少吧
4923 次点击
所在节点    程序员
73 条回复
doco
2024-01-29 16:12:56 +08:00
web 端也不想要 null
ZhLTE
2024-01-29 16:16:05 +08:00
序列化的时候统一处理
pota
2024-01-29 16:18:39 +08:00
这么和你说 "" 和 null 不是一个类型的数据。你定义一个参数是 string 我塞一个 null 给你,你怎么想?
laaaaaa
2024-01-29 16:19:25 +08:00
@pota 大佬是怎么解决这个问题的
pota
2024-01-29 16:20:07 +08:00
@pota #3 手快发布了。这就不是麻不麻烦的事,作为一个 API 。保持数据格式一致是最基础的要求,还有 json 的{}没数据给[] 的时候也很恶心。
falsemask
2024-01-29 16:20:43 +08:00
spring.jackson.default-property-inclusion=NON_NULL
laaaaaa
2024-01-29 16:22:36 +08:00
@pota 对 还有这个问题,如果返回的是 json 或者 数组, 没有数据 我一般会给 [] 或者 {}, 但是服务端如果返回这样 貌似要 new 一个对象返回, 这不是又耗费资源了吗
me1onsoda
2024-01-29 16:24:23 +08:00
null 要多一步判空吧
chendy
2024-01-29 16:25:14 +08:00
直接不返回就行
或者让他们换一个完善点的 ui 框架,自动把 null 显示成空白那种
azhangbing
2024-01-29 16:26:12 +08:00
因为 kotlin 默认非空
wu67
2024-01-29 16:27:17 +08:00
举个例子.
你这样返回的时候, JS 代码仔需要写多好几个判断来取数, 尤其是需要字符串内容做正则的时候
if (typeof a === 'string' && /balabala/.test(a)) {}
要不就是 if (a.length) 能解决的时候, 需要 if (Array.isArray(a) && a.length) , 看起来是没什么, 但是页面结构复杂度以上去, 数据字段一开始多, 这一大堆多出来的判断, 就会成为客户端代码的屎山
NewYear
2024-01-29 16:30:39 +08:00
1 、有的语言里,null 会报错。还会导致 if 判断不按预期的分支走。(特别适合用来写屎山,因为从语言层面你看不出任何一点不按预期分支走的可能,直到单独调试在这里才发现卧槽)
2 、有的语言里,null 不会报错但是每次都要考虑它就显得很烦了,谁都不想增加负担。

一般的解决方案:禁止 null 的存在,明确每个值的意义。

未定义也不许用 null ,字符串可以用"",数字可以用 0 或者-1 (具体按自己的定义来)。
数字类型:1 是男,0 是女,-1 是未定义
又或者 0 是未定义,1 是男,2 是女,3 是跨性别男,4 是……

字符串类型:""是未定义,"男"是男。

日期类型:“1970 年 1 月 1 日”是未定义,或者“0000 年 00 月 00 日”是未定义。
MoonLin
2024-01-29 16:32:20 +08:00
不返回的话他们可以自己用默认值,返回为 null 就覆盖了默认值,如果要处理的话其实也可以,自己实现反序列化就好了,但是我估计客户端不愿意干,不然你也不会来问了。所以你不如直接不返回,看你用什么序列化框架,一般如 6#所述加个注解就好了。
NewYear
2024-01-29 16:34:27 +08:00
null 和 string/int/date 的类型都不同,不能直接用真的很烦。

楼主后端用是什么语言,不是强类型语言吗。
sanmaozhao
2024-01-29 16:36:49 +08:00
我觉得应该返回 null ( OP 没说返回的数据格式是啥,默认 JSON 了)

1 、JSON 里面本来就是有 null 这个类型的
2 、数字型,不返回 null 的话,用什么表示这项数据没有值呢?用哪个数值都不太合适
如果没值的项直接不返回的话,其实和返回 null 差别也不大
比如对于 js ,就是判断 undefined 和 null 的差别
wu67
2024-01-29 16:39:22 +08:00
还有一个典中典的, 忘记是什么时候遇到的, 有个变量的值, 是 'null'...

出 bug 找前端查的时候, 那一个山崩地裂...

if('null') {1} else {2}
// 1
null123456
2024-01-29 16:40:26 +08:00
调用此方法:StringUtils.isNotBlank(String str)
vagusss
2024-01-29 16:42:34 +08:00
springboot 默认的序列化应该是 Jackson, 应该有配置项可以直接达到你要的效果
lyxxxh2
2024-01-29 16:43:53 +08:00
啥类型的就返回啥类型 很正常
web 端口也一样
字符: ''.split('a')
数组: [].map((() => {})如果返回个 null,前端: mmp
cslive
2024-01-29 16:44:12 +08:00
加注解,字段为 null 会忽略 json 序列化

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

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

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

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

© 2021 V2EX