[不懂就问] 为什么有的后端接口会使用二维数组输出表格数据

2020-10-30 16:44:26 +08:00
 vone

今天在调用一个接口时发现返回值如下:

[
    [50024048,50008827,"宝宝布书",0,"std","Y",25,"玩具 /童车 /益智 /积木 /模型"],
    [124470013,124508010,"水枪",0,"std","Y",25,"玩具 /童车 /益智 /积木 /模型"],
    [50008281,50012922,"密封罐",0,"pro","Y",50016349,"厨房 /烹饪用具"],
    [50010101,50006778,"漏勺",0,"pro","Y",50016349,"厨房 /烹饪用具"],
    [50008281,50012921,"米桶 /米缸",0,"pro","Y",50016349,"厨房 /烹饪用具"],
    [50010101,50006777,"汤勺",0,"pro","Y",50016349,"厨房 /烹饪用具"],
    [50010101,50006776,"全套勺铲",0,"pro","Y",50016349,"厨房 /烹饪用具"],
    [122964001,50023167,"首饰架",0,"pro","Y",122928002,"收纳整理"]
]

1 、从前端角度来看这种格式极为不合理,业务变更时无论是新增列还是删除列,都有可能导致大量的索引位置发生变化,进而需要大量的代码修改,非常容易出错。

2 、从后端角度来看,Array 必须是同类型的数据,才能做到高效和节省内存,而且有些静态语言很难反序列化同一数组下类型却不一致的 JSON 。

有没有人知道使用二维数组传输在哪些场景下是存在优势的。

自己猜测两个:

1 、结构更加紧凑,节省带宽

2 、有隐藏字段名的需求

3435 次点击
所在节点    程序员
33 条回复
seakingii
2020-10-30 17:00:32 +08:00
省内存,省流量,加快解析。
lzhnull
2020-10-30 17:08:04 +08:00
电商平台也是这么返回的把
seakingii
2020-10-30 17:08:43 +08:00
如果你用过 .NET 里的 DataTable,就明白这种做法 。

模拟 Json:



let user_table = {

"columns": [
{ "column_name": "user_name", "data_type":"string" },
{ "column_name": "age", "data_type":"int" },
{ "column_name": "sex", "data_type":"int" },
],


"rows":[

["张三",20,1],
["李四",20,0],
["王五",20,1],

]

};



一个通用的方案,在客户端,可以很简单写一个解析器,将上面的 json 解析 json 对象数组,解析后的

let client_user_table = [
{"user_name":"张三 ","age":20,"sex":1},
{"user_name":"李四","age":20,"sex":0},
{"user_name":"王五 ","age":20,"sex":1}
];


============
这种做法,在几行数据,几十行数据时效果不明显 ,几百行 ,几千行甚至更多时,收益就多了
vone
2020-10-30 17:17:14 +08:00
@lzhnull 就是某宝的接口。

@seakingii 我是 .NET 开发,DataTable 的结构绝对是没问题的,但是在我遇到的这个接口里面是不存在列名和列类型的。

补一下完整的响应数据:

![image.png]( https://i.loli.net/2020/10/30/XR8mztFJ69wPxgv.png)


那是否说明阿里业务框架中可能还存在另一个接口可以一次性拿到业务接口的字段名,进而解析出对应的结构。
fengmumu
2020-10-30 17:26:12 +08:00
感觉应该有个地方有一个索引+对应字段的数据
sunmoon1983
2020-10-30 17:28:27 +08:00
@vone 你这数据返回来我,怎么才能知道哪个字段对应哪个值呀?{"user_name":"李四","age":20,"sex":0},这样才行吧?
vone
2020-10-30 17:33:13 +08:00
@sunmoon1983 我的疑问和你一样,就是 JSON 传输时为什么不使用 obejct 而使用 array 这个反人类的结构。


发帖主要是想搞明白在哪些场景下 array 会有优势(因为这是某宝的接口,所以我总觉着是阿里大佬特意设计的)。
vone
2020-10-30 17:34:17 +08:00
@sunmoon1983 字段对应值现在看来只能通过文档去约定。
oott123
2020-10-30 17:35:46 +08:00
第一个前端的问题可以通过完善的工具链解决。

第二个后端的性能问题不存在,这只是一种序列化而已,存储肯定不是这么存的。
tesguest123
2020-10-30 17:45:11 +08:00
@sunmoon1983 文档完善也没问题,按照索引拿对应的数据
Kirsk
2020-10-30 18:52:54 +08:00
后端的锅 只要不是 json 规范对前端都不友好
simonlu9
2020-10-30 18:55:28 +08:00
带宽是王道啊
yeqizhang
2020-10-30 18:58:31 +08:00
geo 数据我才这么搞,特别是车辆的 GPS 数据,量太大了
xuanbg
2020-10-30 19:17:08 +08:00
特殊情况下可以这样搞没问题。
zjsxwc
2020-10-30 19:19:38 +08:00
省了传 key 的带宽?
BoarBoar
2020-10-30 19:37:27 +08:00
估计就是早期开发人员太菜,后来者又不敢动老代码,又不是不能用
抖音接口视频数组里,每个视频 100 多个 json 字段,然而接口相应速度爆阿里 10 倍
vone
2020-10-30 19:53:52 +08:00
@simonlu9
@yeqizhang
@zjsxwc 可能是唯一的解释了。

@xuanbg 对的,我就是想问问看有没有人知道是哪种特殊场景下这样做的。

@BoarBoar 这不会吧,早期的阿里开发更是大佬中的大佬吧。
xcstream
2020-10-30 19:54:45 +08:00
只要不改需求就没问题
FreeEx
2020-10-30 23:14:29 +08:00
就真差这点带宽?感觉就像是把钱全花在维护这个破数据格式上面去了。
TheCure
2020-10-31 00:14:27 +08:00
这样做的场景很多, protobuf 序列化之后也是没有 key 的, 数据库存每一行也不是存 key 的.

知道 schema 的情况下, 少传 key 性能当然更好.

性能不是问题的情况下, 用带 schema 和 type system 的写前端当然爽. 不是阿里程序员蠢, 是如果没在那种场景, 没有在西溪园区会议室通宵压测调试过就无法体会为什么要做这么多的 tradeoff

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

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

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

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

© 2021 V2EX