ios/android 很难处理对象数组吗?

2020-05-12 15:00:14 +08:00
 sayitagain

一直以来有个疑问,之前公司的 ios 开发要求我的接口给出的数组数据不要是对象,说处理不了,不能处理. 举例,本人 PHPer,我通常自己用的数组都是带下标转的,例如 { "100":{ "id":100 "title":"xxx" }, "105":{ "id":105 "title":"sss" } } 当我已知 id 是 105 的情况下我就可以直接 $array[105][title]取数据了.当我需要渲染数据的时候我就直接 foreach,数组的下标似乎对我没有任何影响. 但公司的 ios 说上面的处理不了,对数据提出以下要求,一定要下面这种常规的数组形式,而不是对象形式 [ "0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" } ] 不明白处理上有啥不同?还是有什么说法?

8344 次点击
所在节点    程序员
79 条回复
ben1024
2020-05-12 20:46:54 +08:00
数据规范是一个问题,客户端处理能力又是另一个问题
lagoon
2020-05-12 20:58:58 +08:00
不抬杠,冷静探讨。

楼主自己也说,“对象数组”。

也就是说,楼主自己也认为,实际上是要返回“数组”这种东西的。

那么查一查,json 规范,数组是怎么定义的就一目了然。

按照 json 的规范,数组由“[]”包裹。


当然,楼主说这种能不能解析,肯定是有办法解析的。但绕开 json 规范的思路,实现一种自己思路的对象数组,是不是不太好呢?

楼上好几位要加"[]",也是这个缘故。加上了,才是 json 规范思路里的数组,别人也更好的按规范解析了处理。
gz911122
2020-05-12 22:02:36 +08:00
一看后端老哥就是 php 的
to2false
2020-05-12 22:11:52 +08:00
[ "0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" } ]

这种才是对象数组,php 封装一个 json_encode 方法是让你方便不是让你随便
luozic
2020-05-12 22:20:45 +08:00
不要随便,id 当 key 这种不符合 json 设计规范。
devjia
2020-05-12 22:30:20 +08:00
你这么搞, 客户端同学没打你就不错了,哈哈哈哈
mxalbert1996
2020-05-12 23:28:57 +08:00
我就不懂了,如果你只是为了在 PHP 里方便,那你里面又放一边 id 的意义何在?
Takuron
2020-05-12 23:30:02 +08:00
大学生做 Android 的表示这种数据不难处理,类里面单独写个方法遍历字典就好了,少量数据应该也不会明显瓶颈。
但是我要是用 GSON 的项目后端给我这种接口,打他的话带我一个,好好的数组规范用轮子完美无缝衔接的事情。
nieyujiang
2020-05-12 23:35:11 +08:00
换我估计要扔屏幕.
weixiangzhe
2020-05-12 23:53:23 +08:00
js 里也是无序啊,不建议用 object
tanranran
2020-05-12 23:55:03 +08:00
7 楼最友好,没有之一
souths
2020-05-13 00:24:53 +08:00
key 别用变量
souths
2020-05-13 00:35:14 +08:00
{"id":1 "key":"avatar01" "size":"1024" "url":"https://w.v.com/image/1"}

[{"id":1 "key":"avatar01" "size":"1024" "url":"https://w.v.com/image/1"},{"id":1 "key":"avatar01" "size":"1024" "url":"https://w.v.com/image/1"}]

Android 这两种种 Json 对应的对象就是:

public class FileDTO implements Parcelable {

private Long id;

/**
* 文件名
*/
private String key;

/**
* 大小
*/
private String size;

/**
* 文件地址
*/
private String url;
}

复制 json 用插件自动生成类的代码,然后用 Gson 自动把接口返回的 Json 变成对象, 用的时候从对象里取值,省时省力
xFrye
2020-05-13 01:19:40 +08:00
既然是 array,为什么不用 JSONArray 返回?数组下标+JSONObject 来表示一个有序列表的做法我看不懂
q409195961
2020-05-13 02:11:03 +08:00
作为一个好的后端

就应该征求前端的意见,尽量给出前端想要的数据结构

同认可 7L 那种方式
slyang5
2020-05-13 07:56:30 +08:00
@sayitagain 貌似 PHPer 都不太喜欢 面向对象。 我之前也遇到过这种。
passerbytiny
2020-05-13 09:22:22 +08:00
我看了回复,再回头看描述,才发现楼主是
{"100":{ "id":100 "title":"xxx" }, "105":{ "id":105 "title":"sss" } }
ios 要
[ "0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" } ]

而不是楼主要
[ { "id":100 "title":"xxx" }, { "id":105 "title":"sss" } ]
而 ios 要
[ "0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" } ] 。

那么我的结论如下。
主要的锅是楼主的,不理解强类型语言中 MAP 和 ARRAY 的区别,以及 JSON 中 OBJECT 和 ARRAY 的区别。PHP 中对象 /MAP 跟数组一样,转成 JSON 字符串后也一样,或者楼主所在的 javascript 反解析 JSON 后也一样,楼主就想当然的认为其他语言中也是一样,但那是不一样的。

次要的锅是 ios 的,楼主列的 ios 数据
[ "0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" } ]
是不对的,那不是 json,应该是
{"0":{ "id":100 "title":"xxx" }, "1":{ "id":105 "title":"sss" }} 。也就 ios 会这么要,android 会要这样:
[ { "id":100 "title":"xxx" }, { "id":105 "title":"sss" } ] 。如果是 android 来要,稍微点一下楼主就会知道 MAP/OBJECT 跟 ARRAY 的区别。
CommandZi
2020-05-13 09:23:15 +08:00
@xrr2016 我是说前端收到的数据
passerbytiny
2020-05-13 09:31:33 +08:00
再想想,ios 的那个锅,也得不负责任的 PHP 来背。PHP 没有纯正数组,若 PHP 的 json 解析框架未做负责人的处理,数组转换成 json 后就是 {"0":{ "id":100 "title":"xxx" }, "1":{"id":105 "title":"sss" } } 这种怪异格式。ios 能提出这样的格式要求,八成是因为以前对接 PHP 时见过这种格式。
yikuo
2020-05-13 09:57:58 +08:00
@passerbytiny 这锅 php 不背吧,如果是正规用法,php 中纯数组转换成 json 后也是标准 json 形式的[xxx,xxxx],只能说明楼主在混用普通数组和关联数组。

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

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

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

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

© 2021 V2EX