接口返回格式的问题,很苦恼

2019-04-15 21:36:17 +08:00
 kkshell

我是一名渣渣 PHPer,公司做项目我负责开发 API 供 APP 端使用,可是 Android 端出现了如下的要求。 以下数据都是通过 json_encode 后的数据 比如返回数据列表如下(有数据的情况下) { "status": 200, "msg": "获取成功", "data": { "user_id": 1906, "maintenance_id": 2825 } }

无数据的情况返回如下 { "status": 301, "msg": "获取失败", "data": [] } }

然后 Android 端说获取失败也好什么也好,data 那里都要返回对象给他才行,不能有数据时是对象,无数据时又变成数组。可能是我菜,但我认为这是正确的返回。IOS 端也认为没问题,然后 Android 说他用的框架没有办法像我这样返回进行接收,说框架作者讲了只能这样接收,还有说他以前都是这样,同学都是这样接收的。

无奈之下进度问题上网百度谷歌之后,使用 JSON_FORCE_OBJECT 进行操作 $data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_FORCE_OBJECT);

虽然 data 为空的时候是能解决问题,但是如果 data 二维数组的时候,就会变成如下格式,Android 和 IOS 都不好接受 { "status": 200, "msg": "获取成功", "data": { "0": { "suites_id": 379, "suites_number": "102" }, "1": { "suites_id": 431, "suites_number": "101" } } }

因此非常苦恼,导致只能在空的时候换成以下这种格式返回 { "status": 301, "msg": "获取失败", "data": { "user_id": 0, "maintenance_id": 0 } }

我之前都没遇到过需要这样返回的,我认为我返回的是 JSON 的默认格式,没有问题,大伙们帮我看看,也许是我能力不足,没有遇到过这样的问题,我现在不知道怎么修改才好,还是说我没有错怎么说服他呢?

3545 次点击
所在节点    问与答
43 条回复
kkshell
2019-04-15 21:36:52 +08:00
这代码的格式有点问题阿,辛苦各位帮我看看咯
kkshell
2019-04-15 21:42:47 +08:00
求指点迷津
Sanko
2019-04-15 21:43:39 +08:00
android 菜
kkshell
2019-04-15 21:48:32 +08:00
@Sanko 那怎么说服他呢
heIIokitty
2019-04-15 21:48:45 +08:00
根据 status 判断不就 ok 了吗
kkshell
2019-04-15 21:49:53 +08:00
@heIIokitty 他说接收格式要统一。。
heIIokitty
2019-04-15 21:52:38 +08:00
@kkshell 我也是 Android 开发,我就没听过框架不能改,代码是死的,人是活的,他这是杠
alakey1989
2019-04-15 21:53:02 +08:00
data 做下判断,如果为空数组,就转换成 object。如$data = (object)[];
Nasei
2019-04-15 21:53:15 +08:00
话说为啥没数据的时候还要带个 [] , 直接没有这个字段不行么
pubby
2019-04-15 21:54:47 +08:00
最简单的做法是失败的时候不要包含 data 项
Kylinsun
2019-04-15 21:55:04 +08:00
kkshell
2019-04-15 21:55:15 +08:00
@alakey1989 如果是二维数组他就要[]
kkshell
2019-04-15 21:57:04 +08:00
@Kylinsun 你这个貌似可以,谢谢
kkshell
2019-04-15 21:57:37 +08:00
@pubby 不返回他更不行 - -
kkshell
2019-04-15 21:58:13 +08:00
@Nasei 但是就算是不反悔 data 项他也接不了啊
Nasei
2019-04-15 22:03:46 +08:00
@kkshell 可以的吧, 虽然我不写 java , 但我猜他是把 json 反序列成一个类了, 那个类的字段类型是确定的, 默认情况下碰到数组反序列化失败了? 但是没有字段一般他会拿到 null
uTOmOuk3L6sb4MSI
2019-04-15 22:04:11 +08:00
按我个人认为,保持一致性挺好的。不是扛。
kkshell
2019-04-15 22:04:44 +08:00
@ODD10 好吧
kkshell
2019-04-15 22:09:38 +08:00
@ODD10 但是无数据的时候,还要返回{ "status": 301, "msg": "获取失败", "data": { "user_id": 0, "maintenance_id": 0 } }不觉得是多此一举吗
humpy
2019-04-15 22:09:53 +08:00
这是 php 的 array 混合了 list 和 map 的锅。

java 也不是不能处理,先按对象解析,解析不了再按列表解析就行了。

不过最好还是 php 改,json_encode($data ?: new stdClass) 就行了。其实我建议少用数组,这玩意害人害己,定义一个数据类也花不了多少时间

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

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

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

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

© 2021 V2EX