某些后端不知道是因为太懒还是因为其他原因,对于 json 的数据处理表示很崩溃

2020-02-11 15:38:38 +08:00
 AppxLite

首先,命名一踏糊涂,比如某些订单列表数据 A、B、C。

../api/a

{
	"code": 200,
    "msg": "ok",
    "a_list": {
    	...list
    }
}

../api/b

{
	"code": 200,
    "msg": "ok",
    "b_list": {
    	...list
    }
}

../api/c

{
	"code": 200,
    "msg": "ok",
    "c_list": {
    	...list
    }
}

因为这三个 api 接口用的都是相同的页面和布局,就因为这种脑残的 list 命名,前端会为此作出特殊的处理。

再举个例子:不知道某些后端对 json 是不是有什么误会,json 的数组和对象都分不清(在他们眼里,json 的对象和数组都是数组),这不是最恶心的,更恶心的是,同一个 api 接口同一个值,在不同的情况下,给你返回不同的数据类型。比如:

同一个接口:../api/data

某些情况是这样的:

{
	"code": 200,
    "msg": "ok",
    "data": {
    	...list
    }
}

某些情况又是这样的:

```json
{
	"code": 200,
    "msg": "ok",
    "data": []
}

再举个例子,明明不是数组,但是却要用[]来包一层,比如:
已知这个 data 的数据结构永远不是一个数组的。

```json
{
	"code": 200,
    "msg": "ok",
    "data": [{
    	...list
    }]
}

再举个例子,当只有一条数据的时候,是这样的:

{
	"code": 200,
    "msg": "ok",
    "data": {
    	...list
    }
}

当没有数据的时候是这样的

{
	"code": 200,
    "msg": "ok",
    "data": []
}

当有一条以上的时候又是这样的:

{
	"code": 200,
    "msg": "ok",
    "data": [{
    	...list
    }]
}

这些后端不知道是因为懒,还是因为自己的认知有限,每次和这样恶心的接口对接,作为一个前端的人来说,看到这样的接口,就像吃屎一样。和他们沟通不但不认同,还各种推脱说{}就是数组。。。

各位看官,你们觉得这是不是小题大做了?虽然通过各种处理,这些问题都不算啥,但是为何可以通过常识来解决的事,为何不把规则当规则呢?你用 json,就要遵循 json 的规则。而不是这就是 XXX。

各位前端小伙伴们,遇到这样的接口,你是怎么处理的?

9220 次点击
所在节点    程序员
75 条回复
HanMeiM
2020-02-12 11:20:25 +08:00
所以,很多垃圾 PHP 程序员拉低了 PHP 这门语言 +1
gz911122
2020-02-12 11:41:44 +08:00
我猜你们的后端是 php
zakokun
2020-02-12 11:59:08 +08:00
怎么又在骂 php 了...码农经常自称逻辑严谨,结果一个个都这么狭隘的
说白了,这就是你们团队有问题,前端,后端,移动端一个个都不是无辜的,一个都跑不掉。不可能后端一坨屎,前端都是白莲花,就从后端能出这种接口,你们前端包括 leader 既然没开会沟通定规范,前端移动端也好不到哪去啊
xmge
2020-02-12 12:36:14 +08:00
确实,这种格式对前端很不友好。

感觉后端做成这样也得刻意写个方法处理下。
xmge
2020-02-12 12:36:30 +08:00
总结:你和他有矛盾吗?
loshine1992
2020-02-12 12:45:08 +08:00
我们后端 PHP 也出了一下子返回 {} 一下子返回 [] 的问题

弄得我头都大了。。
ljhaoboy
2020-02-12 13:56:45 +08:00
我想到了饿了么的签到😂,签到没奖励的时候返回的[],有奖励的时候就是 json
wangbenjun5
2020-02-12 14:02:24 +08:00
只说一个 PHP 可能会遇到的问题就是一会 {} 一会 [],让 PHP 特殊处理一下把空数组转成 object 就能解决,其它都是规范问题,前后端交互如果没有规范那是很头疼的事情,多点沟通吧!
xmge
2020-02-12 14:37:46 +08:00
@ljhaoboy []也是一个 json 啊。
veike
2020-02-12 17:47:00 +08:00
路由就不说了,自己的问题,和 php 没关系。
返回的数据问题:
当只返回一条数据的时候:
data:[] 就变成了 data:{},这里返回的是该条数据。例如:后端是:["ok" => 1],前端:{"ok":1},如果为空,就是[]。如果放在数组里,就是[{}],前端返回和后端一样。

当返回多条数据,data 就是 data:[{},{}],在后端就是:
[
["foo1" => "bar1"],
["foo2" => "bar2"]
],
到了前端就是:
[
{
"foo1" => "bar1"
},
...
]

然后如果分页的话,一般是,后端
[
"last_page":2,
data:[
{},
....
]
]

这些就是自己处理的,你要和后端说一下。
然后返回的数据要统一处理一下。可以这样,

json_encode([],JSON_FORCE_OBJECT | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)

这样在前端返回的都是 object。
hallDrawnel
2020-02-12 18:25:50 +08:00
List 就该是 List,kv 就该是 kv,跟他说不清楚就向上汇报。
back0893
2020-02-12 19:56:21 +08:00
就是后端的问题
应该是直接拼的返回值
因为 php 里面的 list 和 dict 不区分导致的,叫后端处理下就完事
php01
2020-02-12 20:15:59 +08:00
是人的问题,大家别怪到后端的问题上,也不要怪到 php 的头上了。
如果你们后端不知道怎么做,告诉你们的后端,new \stdClass() 就是一个空对象了,确实是要几行代码的。
melvin
2020-02-12 21:07:53 +08:00
如果我们后端也这样提供,我也得骂他丫的,这种谁顶得住
yeqiaowei321
2020-02-13 09:00:03 +08:00
@Juicpt 哈哈哈哈,太秀了

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

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

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

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

© 2021 V2EX