同事为了 JSON 怎么写吵起来了!请各位断案!

2019-12-16 14:42:11 +08:00
 codeismylife

A 同事:

[
	{
		"192.168.1.2": {
			"Memory": "10%",
			"HardDisk": "25"
		},
		"192.168.1.1": {
			"Memory": "25%",
			"HardDisk": "10"
		}
	}
]

B 同事:

[
	{
		"ip": "192.168.1.1",
		"Memory": "10%",
		"HardDisk": "25"
	},
	{
		"ip": "192.168.1.2",
		"Memory": "25%",
		"HardDisk": "10"
	}
]

我认为 B 写的是对的,但是不知道怎么科学地反驳 A。A 这么写好吗?不好的话 A 的问题在哪儿呢?

32991 次点击
所在节点    程序员
342 条回复
shintendo
2019-12-16 14:57:53 +08:00
先不说规范不规范。

A 形式的数据一定能转成 B 形式,B 形式的数据却不一定能转成 A 形式(比如要求允许 ip 重复,或者要求有序),从这个角度也是用 B 好
x66
2019-12-16 14:57:58 +08:00
不负责任的猜一下,A 应该是写 python 之类的动态语言的,而 B 多半是写 Java 的。
sevenzhou1218
2019-12-16 14:58:20 +08:00
我猜,你们是写 php 的吧? 只有写 php 的在写 api 的时候对象和数组不分。
codeismylife
2019-12-16 14:59:40 +08:00
@x66 A 写过 GO……B 是 JAVA 的
netnr
2019-12-16 14:59:44 +08:00
选 B,标准的数据格式

如果选 A,那么还可以继续改造

{
"192.168.1.2": "10%,25GB",
"192.168.1.1": "25%,10GB"
}

如果说后续的扩展 一台机子有多个 IP,在加个 主机名称的字段,按照思维:主机名 → 多个 IP → 每个 IP 对于的内存 /硬盘,而不是 IP → 主机名 /内存、硬盘
ai277014717
2019-12-16 15:00:32 +08:00
A 的话转 model 可能要多写几步,B 很容易映射
dp2px
2019-12-16 15:00:52 +08:00
如果是为了根据 ip 查询选 A,A 其实是 JSON 字典。一般用于展示的都是 B,B 才是符合面向对象的实体类。
maomaomao001
2019-12-16 15:01:08 +08:00
@codeismylife 关键是 , 这个就和 讨论 rest 一样,我感觉就是在浪费时间 , 各种最佳实践都是随着时间的推移都会变化的, 我现在开发前端基本上更加倾向于 独立应用 (就是不完全依赖后端发过来的数据结构了) , 就写个转换层,以后自己扩展也好,或者万一哪一天 后端重构 数据结构大变也好, 就非常容易处理了
Vegetable
2019-12-16 15:01:36 +08:00
无脑 B
dp2px
2019-12-16 15:02:34 +08:00
@dp2px 很显然查询一般是交给数据库的,所以毋容置疑选择 B,A 的使用场景我暂时想不到,可能根本就是个人独创的伪场景
orzorzorzorz
2019-12-16 15:02:38 +08:00
我碰上这事一般直接找老大,硬技能在这道题上没用,效率第一。
Hanggi
2019-12-16 15:03:18 +08:00
很明显一个是 map 一个是 array。
他们所对应的遍历方法也不同,array 遍历方便一点,各种辅助函数也很多,没有特殊要求一般是走 B。
如果有根据键寻找值的操作,map 会方便些。

但是两个都可以轻松实现互相转换,所以不存在对错。
还是看具体情况了。
AlisaDestiny
2019-12-16 15:03:57 +08:00
@codeismylife #11
直接把这个帖子丢给 A 同事看就行了。
finab
2019-12-16 15:05:00 +08:00
选 B 吧,B 能兼容 A,A 兼容不了 B

@maomaomao001 这就是 JSON Object Mapper 做的事吧,基本所有的这样的库都带 map 方法,不用自己写
FaceBug
2019-12-16 15:05:38 +08:00
当 IP 重复怎么办,比如你们将来开了多个机房,每个机房的子网都是 192.168.1.0,数据要汇总到一起
FaceBug
2019-12-16 15:06:49 +08:00
把 KEY 再改造一次?机房+IP,每次解析还先把 key 拆成机房、IP 两部分?
Cbdy
2019-12-16 15:08:13 +08:00
@netnr 你还是太保守了,这样改造更方便:"192.168.1.2,10%,25GB;192.168.1.1,25%,10GB"

什么?有异议?别浪费时间了! ACL 懂不懂?写个转换层不会吗?又不是不能用!
sgiyy
2019-12-16 15:09:29 +08:00
B。

可以直接用数组的方法不够香吗?对于前后端都更方便点。
hevi
2019-12-16 15:09:31 +08:00
要是选 a 的话,我觉得不如:
```
[
["192.168.1.1", "10%", "25"],
["192.168.1.2", "10%", "25"],
["192.168.1.3", "10%", "25"]
]
```
(手动滑稽)
qiaobeier
2019-12-16 15:12:40 +08:00
B 好,可读性更强,扩展性更好。

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

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

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

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

© 2021 V2EX