可能是另一场圣战:后端返回的 JSON 的值是只要 String 类型呢,还是各种类型都包括呢?

2018-05-19 15:21:21 +08:00
 winiex

工作中和不同的客户端开发者合作过,有的要求返回的 JSON 统一只包含 String 类型:

{ a: "THYM", b: "107", c: "false" }

而有的则要求数据要表达自己的类型:

{ a: "THYM", b: 107, c: false }

我个人是支持第二种写法的,因为不用再写一堆转 String 和转回类型的代码。大家团队都选择何种方式呢?又是出于何种原因与理由呢?

19166 次点击
所在节点    程序员
161 条回复
Axurez
2018-05-19 21:30:41 +08:00
@hyyou2010 @huclengyue 没有对象可以,可是我说了啊,这个东西本身就是一个对象啊……
Axurez
2018-05-19 21:31:03 +08:00
@hyyou2010 但你还是不能排除后端直接扔一个 null 过来的情况?
lxian2
2018-05-19 21:32:34 +08:00
huclengyue
2018-05-19 21:33:06 +08:00
@Axurez 所以我们做客户端的很辛苦吧。。不仅判断 null,还要判断"null"😄
barbery
2018-05-19 21:35:10 +08:00
方式二有个坑,就是 bigint 的时候会前端 js 获取值会溢出,后端要生成 string 的格式才行
hyyou2010
2018-05-19 21:47:06 +08:00
@Axurez

是的,后台扔一个 null 之类过来客户端这边很难处理。从编程上说客户端也是能处理的,但麻烦,隐患无穷,绝对不要选择,要考虑:
1、换个后台又会发怎样的数据对象过来?
2、客户端换人之后他还了解这里面的坑不?
3、加班到很晚脑袋发晕时哪个不容易出错?

我在多个项目之后的总结就是,只能是整数或字符串,不要布尔和 null 对象,数组内类型统一,等等。
本主题的 1 是比我更绝对的做法,我暂时不能判断得失。
janxin
2018-05-19 21:49:22 +08:00
@huclengyue SwiftyJSON 之类的库了解一下?
bobuick
2018-05-19 21:51:24 +08:00
明明人家 JSON 有表达 bool, int 的能力,硬是都 string 不是脑残么
kslr
2018-05-19 22:06:54 +08:00
@bobuick 这不是脑残,多语言混用会出很多问题,这是经验。bool 用数字 null 变空白
Mitt
2018-05-19 22:23:18 +08:00
@kslr 从经验上来看,应该是写的人技术不行
kslr
2018-05-19 22:26:55 +08:00
@Mitt #70 所以发布一个行政规则解决这个问题?
icyalala
2018-05-19 22:36:47 +08:00
@huclengyue
iOS 那么多 JSON 处理的库,很多都有自动类型转换的功能
要是 iOS 因为 JSON 传参崩溃或者类型对不上,那只能说这个开发者水平太差
lamCJ
2018-05-19 22:44:37 +08:00
前端:后端真*懒 数据库 null 都 tm 直接返回 劳资 iOS 遇到 null 会闪退不懂吗

后端:客户端真*菜 自己代码类型安全都保证不了 我接口文档返回参数有哪些情况都说那么明白了 还教育我数据库设计不能用 null ?

其实从谁的角度看都似挺有道理的 但每个角度的问题都有相应的解决办法 这种问题本身也是团队合作和技术管理的问题
zabida
2018-05-19 22:54:20 +08:00
不懂第一种的意义何在
klesh
2018-05-19 23:00:48 +08:00
如果对于具体场景而言,需要的数据表示已经超出了 JSON 的表达能力,比如说 BigInt 这种,与其用所谓的第一种,何不考虑下其他的格式?比如 YAML ?还可以流式按行处理,岂不美哉。
congeec
2018-05-19 23:07:07 +08:00
@winiex 如果 json 数据要放到 ui 里展示出来,都用 string 就方便了,但这也是伪需求啊,只有 C 语言级别的才需要把所有数据都转换成 string 类型。

如果需要取里面的值做计算,直接一句 MMP 甩他脸上。
james2013
2018-05-19 23:09:10 +08:00
当然是第二种好用,本人开发过 Android 应用软件和 Java 后台.以下只是个人看法

@huclengyue json 本来就是一个对象,在 js 里可以直接用.在 Android,都不敢想象现在谁还去手写 json 解析对象?数据又不少,里面嵌了好几层对象,有的接口像订单详情字段特多,手写会崩溃的.早就用 GsonFormat 将接口结果进行自动解析,后台搞成全 string 的,我都要吐血了.

@hyyou2010 至于第二种方法,说后台扔一个 null 值给客户端不好处理,我不这么认为.
楼层中有人说的好,还有一个问题,比如人家把个人资料里描述改成字符串,返回是这样{desc:"null"},用第一种方法,我觉得不好处理.这个是代表该字段没有值还是说"null",歧义很大.第二种的话,就简单了,该字段是{desc:null}或者根本没有返回,说明该字段没有值,如果是{desc:"null"},那说明这是用户设置的.总不可能把客户输入的自动删除掉吧?刚才我试了微信签名,可以单独设置 null.

对于后台返回的数据,是先通过 json 解析工具自动转成对象的.传 null 过来很正常,本来有的内部对象 /字段是 null,因为该对象 /字段本来就没有数据,在展示的时候,也会先验证.
比如是对象,验证是否为 null;如果是集合,还需验证集合大小大于 0,要不然,一堆空指针报错,因为同一个接口有的地方是有数据,有的没有.
列举的 3 个问题,这个跟 json 格式没有关系呀.
1,2 这种是交接和沟通问题,开发新接口,客户端需要把数据正常显示在 app 上,后台返回错误的格式 /数据也常见,叫后台重新发布,因为项目是采用统一格式返回的.比如{retCode:1,message:"xxx",result:{...}},改了的话很不好.如果是已发布的代码,后台还敢修改接口字段类型和名称,已上线版本容易出大问题的.一般这种是加版本号,而不是在原来版本修改.
3.的话,我也是承认的,加班疲惫时总会有出错的时候,做第一个也会的.
missdeer
2018-05-19 23:10:46 +08:00
这就是劣币驱逐良币的过程。最开始一个懒汉或者菜鸟用了第一种,导致其他不那么懒或不那么菜的人只能妥协,慢慢的这个问题现象就范围越来越广了。
qdwang
2018-05-19 23:18:35 +08:00
需要 json 就用第二种,除非业务有大整数。不用第二种,干嘛还用 json ?自定义二进制格式好了,还省空间
huclengyue
2018-05-19 23:31:56 +08:00
@james2013 你试试动态语言的后端,php python 这种的,java 后端对安卓当然是没问题的,如果各户端是 iOS,怎么办呢? boolean 怎么传

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

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

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

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

© 2021 V2EX