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

100 天前
 laaaaaa

环境

jdk8, springboot;

需求

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

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

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


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

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

ps

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

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

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

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

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

楼主后端用是什么语言,不是强类型语言吗。
sanmaozhao
100 天前
我觉得应该返回 null ( OP 没说返回的数据格式是啥,默认 JSON 了)

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

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

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

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

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

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

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

© 2021 V2EX