V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codeismylife
V2EX  ›  程序员

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

  •  
  •   codeismylife · 2019-12-16 14:42:11 +08:00 · 32913 次点击
    这是一个创建于 1804 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 的问题在哪儿呢?

    342 条回复    2019-12-28 23:33:44 +08:00
    1  2  3  4  
    imn1
        101
    imn1  
       2019-12-16 16:32:32 +08:00   ❤️ 2
    B 通用,A 适合 ip 做主键的场合
    sherlockwhite
        102
    sherlockwhite  
       2019-12-16 16:35:06 +08:00   ❤️ 1
    有一说一,PHPer 不背锅。
    RickyC
        103
    RickyC  
       2019-12-16 16:36:30 +08:00
    建议 B 同事的答案

    比如更改操作,

    B 同事只要按照 key 去替换就可以了

    而 A 同事需要
    step1:删除掉原来的元素
    step2:添加一个新的元素
    如果是有序的表,还要有一个
    step1.5: 找到原来元素的位置
    libook
        104
    libook  
       2019-12-16 16:37:02 +08:00   ❤️ 6
    没有应用场景谈对错是没有意义的。

    用于字典(映射)的话选 A (其实没必要放数组里了);比如需要频繁地按照 IP 地址来取相关信息,此时用 A 方案能避免大量的循环语句。
    用于呈现对象列表的话选 B ;比如返回一个服务器列表,迭代对列表里的每一台机器的信息做相应的处理。

    两种我都经常用,没有啥绝对对和绝对错的,哪种合适就用哪种。
    justforlook44444
        105
    justforlook44444  
       2019-12-16 16:37:07 +08:00
    json = javascript object notation
    EurekaSeven
        106
    EurekaSeven  
       2019-12-16 16:37:09 +08:00 via Android   ❤️ 1
    抛开应用场景谈对错都是耍流氓。
    botian
        107
    botian  
       2019-12-16 16:37:24 +08:00 via Android
    B 的可扩展性比较好
    GroupF
        108
    GroupF  
       2019-12-16 16:37:55 +08:00
    这个问题我不会,我直接给前端返回 B
    sockpuppet9527
        109
    sockpuppet9527  
       2019-12-16 16:38:26 +08:00
    a 这样写不通用吧。。b 是通用的
    这么说可能会挨打:比如我司写 c 要用 json 当 rpc 的 payload,a 这种解析很麻烦。。
    GopherTT
        110
    GopherTT  
       2019-12-16 16:45:24 +08:00
    我就想问 A 为什么多了个大括号..
    linZ
        111
    linZ  
       2019-12-16 16:47:41 +08:00
    @GopherTT 是对象,不是数组
    qwerthhusn
        112
    qwerthhusn  
       2019-12-16 16:47:47 +08:00   ❤️ 3
    A 是前端,B 是后端
    前端总是想要啥处理都不用做直接用的数据
    后端想从数据库返回后不做太多处理直接返回
    ganbuliao
        113
    ganbuliao  
       2019-12-16 16:48:16 +08:00
    a 最大的问题应该就是 排序的问题吧 如果使用 jq 的 ajax 的话 json 会重新根据 key 排序
    前端同学得到的数据应该是 下面这样的吧
    ```
    [
    {

    "192.168.1.1": {
    "Memory": "25%",
    "HardDisk": "10"
    },
    "192.168.1.2": {
    "Memory": "10%",
    "HardDisk": "25"
    }
    }
    ]
    ```
    linZ
        114
    linZ  
       2019-12-16 16:48:37 +08:00
    自己写的项目用 a,大家一起维护用 b
    svenz
        115
    svenz  
       2019-12-16 16:54:21 +08:00
    @qwerthhusn 想吐槽你几句想想算了黑前端黑上瘾了 A 这种输出结果最大的问题就是回到项目内 大量的 hardcode 出现 跟前后端没关系 只跟水平和脑子有关系
    wwcxjun
        116
    wwcxjun  
       2019-12-16 16:54:34 +08:00   ❤️ 1
    PHP 又背锅了... 我写 PHP 一直都是返回 B 的格式。
    xuanbg
        117
    xuanbg  
       2019-12-16 16:56:51 +08:00
    只用过 B 这种结构,A 这种兼职匪夷所思
    weixiangzhe
        118
    weixiangzhe  
       2019-12-16 16:58:01 +08:00 via Android
    如果是个 list 的话,a 放给前端 转成 js 的对象后,在不同的浏览器里顺序会变
    xinjiang
        119
    xinjiang  
       2019-12-16 17:00:15 +08:00
    场景不同组装的数据结构不同,A 为 Map 型,B 为 Array 型,不比场景讨论有意义?
    xinjiang
        120
    xinjiang  
       2019-12-16 17:05:57 +08:00   ❤️ 1
    很明显 A 同事的数据结构是特定场景下进行了查找优化的,B 同事的数据结构当要进行频繁的查找时不用转成 Map 结构还怎么玩?
    xinjiang
        121
    xinjiang  
       2019-12-16 17:06:23 +08:00
    只是 A 外面的那个数组是完全没必要
    deepred
        122
    deepred  
       2019-12-16 17:07:28 +08:00
    A 有必要用数组吗?
    linxl
        123
    linxl  
       2019-12-16 17:08:59 +08:00
    A 这种客户端解析会不会很麻烦啊?
    sonxzjw
        124
    sonxzjw  
       2019-12-16 17:10:53 +08:00
    数据结构服务于使用场景,没有场景作为前提,这样判断太武断了。如果你非要说哪个好的话
    EastLord
        125
    EastLord  
       2019-12-16 17:12:27 +08:00
    我觉得要看使用场景,都没错
    IamUNICODE
        126
    IamUNICODE  
       2019-12-16 17:13:12 +08:00
    对接手机端肯定选 B,对接网页前端随便吧(个人觉得 B 更好)
    back0893
        127
    back0893  
       2019-12-16 17:16:22 +08:00   ❤️ 1
    关 php 啥子事,
    java 或者 java 都能写出啊.
    qzhai
        128
    qzhai  
       2019-12-16 17:16:23 +08:00
    b 永远都是对的 使用的时候 可以吧 B 转 成 A。。。
    burnings0506
        129
    burnings0506  
       2019-12-16 17:16:24 +08:00
    A 连数组和对象都没搞明白。
    index90
        130
    index90  
       2019-12-16 17:19:39 +08:00   ❤️ 1
    LZ 题目是不是写错了啊?
    A 和 B 提供的数据结构说的不是一回事啊。A 的数组每个元素包含多个 IP 数据,而 B 的数组每个元素是一个 IP 数据,那么他们各自的数组分别代表什么?
    shintendo
        131
    shintendo  
       2019-12-16 17:20:26 +08:00
    @qwerthhusn 别闹,前端才不想要 A 这么难用的结构
    hbolive
        132
    hbolive  
       2019-12-16 17:20:56 +08:00
    一般情况下当然是 B 科学,A 以 IP 作为键值可能适合于某些特殊情况,但是为啥多一层{}?
    lonelymarried
        133
    lonelymarried  
       2019-12-16 17:23:14 +08:00
    如果 ip 是唯一的,那么 a 的这么写也可以
    swulling
        134
    swulling  
       2019-12-16 17:24:03 +08:00
    [
    {
    "192.168.1.2": {
    "ip": "192.168.1.1",
    "Memory": "10%",
    "HardDisk": "25"
    },
    "192.168.1.1": {
    "ip": "192.168.1.1",
    "Memory": "25%",
    "HardDisk": "10"
    }
    }
    ]

    完美
    chent
        135
    chent  
       2019-12-16 17:25:15 +08:00
    看使用场景, A 作为 map 使用没必要套进数组.
    有时候 A 根据 ip 取数据与判断什么的很方便, B 作为列表展示比较方便.
    如果 B 要用元素内的 ip 做 k 取数据, 那就要转换回 A 的方式会更高效.
    接口是为使用方服务的, AB 吵其实没意义, 要看谁用数据, 怎么用.
    wodexiaogou
        136
    wodexiaogou  
       2019-12-16 17:25:26 +08:00
    我为啥觉得 A 更好啊,更好理解,也更查询操作,比如获取某个服务器资源时,用 A 更方便,删除时也方便操作
    kkjinping
        137
    kkjinping  
       2019-12-16 17:26:17 +08:00
    选择 B 操作。
    nomemo
        138
    nomemo  
       2019-12-16 17:27:18 +08:00
    看了楼上的回复,学习,总结了几点不用 A 的理由

    1. key 不建议做可变值;
    2. 多了一层解析嵌套;
    3. 对象的含义发生了变化;
    llcfays
        139
    llcfays  
       2019-12-16 17:28:07 +08:00
    不用担心,客户端同学会把 A 喷死的。
    HongJay
        140
    HongJay  
       2019-12-16 17:28:47 +08:00
    哪个后台敢写 a 看我不打死他
    mmqmyy
        141
    mmqmyy  
       2019-12-16 17:29:18 +08:00
    json 肯定要保持 k-v pairs 的一致性啊,不然你得校验多少东西?
    index90
        142
    index90  
       2019-12-16 17:31:17 +08:00
    LZ 最好讲讲场景吧?看数据结构去猜的话,应该是一个批量写入 IP 数据的接口吧。
    我比较站 A,A 作为接口数据描述更清晰,明确 IP 唯一,接口的定义越清晰,功能越单一越好。与前端对接的时候更需要这样。
    B 更通用,后端程序员要考虑更多,接口需要更多书面描述来向使用者讲述接口要求,例如你要加多一句,“IP 不能重复,否者报错,balabala”
    WantSleep
        143
    WantSleep  
       2019-12-16 17:32:15 +08:00
    客户端解析 A 巨麻烦,序列化框架也不能用了
    sunmker
        144
    sunmker  
       2019-12-16 17:32:46 +08:00
    键值对
    键一般就那么几个选项,哪有变量当键的……
    fyxtc
        145
    fyxtc  
       2019-12-16 17:33:43 +08:00
    看来两位同事工作都不是很饱和啊
    SY413927
        146
    SY413927  
       2019-12-16 17:39:21 +08:00
    非特殊情况, 我选 B
    假如不是我特别要求的情况下, 后端小伙伴给我返回了 A 结构, 他会被我打的很惨很惨

    我是移动端。。。
    TypeError
        147
    TypeError  
       2019-12-16 17:40:56 +08:00 via Android
    A 适合某些报表
    大部分情况 B 够用
    sdushn
        148
    sdushn  
       2019-12-16 17:42:10 +08:00
    客户端开发站 B,kv 写法解析起来很舒服,A 怎么解析?先解析字段名,放在 ip 字段里,再解析内容,有点反人类的逻辑。以上观点仅代表自己的想法
    initer
        149
    initer  
       2019-12-16 17:43:06 +08:00
    移动端。 我选 B。
    A 不是不能解析。就是麻烦。
    rumingruyue
        150
    rumingruyue  
       2019-12-16 17:43:28 +08:00
    B 更好解析,用的更多。
    A 为啥用大括号包一下?还有必要用数组吗?
    sdushn
        151
    sdushn  
       2019-12-16 17:44:18 +08:00
    emm,大概明白 A 的写法了,似乎不太适用于前端及客户端开发,使用场景很窄,B 基本是客户端开发的通用写法
    liuy1994g
        152
    liuy1994g  
       2019-12-16 17:45:54 +08:00 via Android
    写成 192.168.1.2Memory, 192.168.1.2HardDisk 岂不是更好?
    cedoo22
        153
    cedoo22  
       2019-12-16 17:48:11 +08:00
    所以。。。。前端 后端 移动端的 同学都会把 A 打死。。。。A 你还是自尽吧
    ala2008
        154
    ala2008  
       2019-12-16 17:53:15 +08:00
    可以劝退 a:)
    whypool
        155
    whypool  
       2019-12-16 17:54:23 +08:00
    [
    {
    id:1,
    name:'哈哈',
    '哈哈':[
    {a:123,c:345},
    {a:555,c:666}
    ]
    }
    ]

    这样写会不会被砍死?
    StarUDream
        156
    StarUDream  
       2019-12-16 18:08:45 +08:00
    其实我想问一下,你们后端用的啥语言。
    Mutoo
        157
    Mutoo  
       2019-12-16 18:16:21 +08:00
    扁平化的结构更易于加工和组织,例如生成表,排序等。
    字典不方便遍历,还需要手动转数组,并单独把 key 作为一个字段并入。
    后端应该提供 B,而前端根据业务需要自行组织。
    feigle
        158
    feigle  
       2019-12-16 18:18:19 +08:00
    A:
    如果知道 ip 的情况下,A 这种情况可以快速定位吧,只是多了个大括号。
    B:
    这种格式通用,不担心不关心业务。
    在需要用 ip 定位的情况下,应该使用 A 格式,一般情况下用 B 格式
    deplives
        159
    deplives  
       2019-12-16 18:18:34 +08:00 via iPhone
    谁要是写 A 这样的给我用 看我不把家里拖鞋拿来招呼他
    IssacTomatoTan
        160
    IssacTomatoTan  
       2019-12-16 18:20:19 +08:00 via Android
    A 不能直接存 mongo
    LEX1994
        161
    LEX1994  
       2019-12-16 18:23:55 +08:00 via iPhone
    b 结构简单
    wanglufei
        162
    wanglufei  
       2019-12-16 18:24:50 +08:00 via Android
    别用 json 了,protobuf flattenbuf 不香吗
    shm7
        163
    shm7  
       2019-12-16 18:38:10 +08:00 via iPhone
    @qwerthhusn 有点道理,写里面人家还要做空校验
    yejianmail
        164
    yejianmail  
       2019-12-16 18:41:17 +08:00 via Android
    我只能接受 B
    ww2000e
        165
    ww2000e  
       2019-12-16 18:48:18 +08:00
    我用 a 比较多,这才发现好多人不喜欢。。
    jarnanchen
        166
    jarnanchen  
       2019-12-16 18:48:34 +08:00
    A 如果出现特殊情况了就很麻烦
    比如 ip 重复,或者为 null 了
    strongcoder
        167
    strongcoder  
       2019-12-16 18:49:12 +08:00 via iPhone
    上一个这么搞的 A 被我们客户端开发打爆了
    mansurx
        168
    mansurx  
       2019-12-16 18:50:41 +08:00
    插楼问一下,如果存 es 的话,应该是支持 B 的类型吧,不知道类型 A 支不支持
    luozic
        169
    luozic  
       2019-12-16 18:52:19 +08:00
    直接点,后面同一个 IP 下面再挂新东西咋表示?
    guanhui07
        170
    guanhui07  
       2019-12-16 18:52:49 +08:00
    B 好
    hoyixi
        171
    hoyixi  
       2019-12-16 18:57:00 +08:00
    个人觉得后者好些,前者如果 IP 字段发生变化,代码又得重新改
    fgk
        172
    fgk  
       2019-12-16 19:10:56 +08:00
    用了 ts 的话 B 可以定义很清晰的接口
    zuokanyunqishi
        173
    zuokanyunqishi  
       2019-12-16 19:20:46 +08:00 via Android   ❤️ 1
    PHP 表示不背这锅
    lepig
        174
    lepig  
       2019-12-16 19:31:21 +08:00
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBB
    zgq3337
        175
    zgq3337  
       2019-12-16 19:34:01 +08:00 via Android
    压缩与展开的区别
    类与函数的区别
    Anarchy
        176
    Anarchy  
       2019-12-16 19:34:43 +08:00
    A 省略了一个 Key 的信息,这就意味着解析方需要额外的工作补充这个 Key 信息。ORM 框架也需要完整信息才能做好映射
    MonoLogueChi
        177
    MonoLogueChi  
       2019-12-16 19:35:03 +08:00 via Android
    个人认为 B 写的好一点,但是 A 写的用起来方便
    answerhuang
        178
    answerhuang  
       2019-12-16 19:38:52 +08:00
    数据传输用 B, 自己本地用的话, 转换成 A 格式.
    sivacohan
        179
    sivacohan  
       2019-12-16 19:53:32 +08:00 via iPhone
    @DOLLOR 你这个玩法我还是第一次见。挺有用的。
    jzmws
        180
    jzmws  
       2019-12-16 20:01:00 +08:00
    b , a 的 要是换个 ip 就 gg 了
    hljjhb
        181
    hljjhb  
       2019-12-16 20:02:21 +08:00 via Android
    B

    elasticsearch 的 node stat api 就是 A 形式,很难受
    wmwgijol28
        182
    wmwgijol28  
       2019-12-16 20:09:08 +08:00
    屁大点事也能吵起来,直接问项目负责人 用哪种结构完事
    fanhed
        183
    fanhed  
       2019-12-16 20:54:39 +08:00
    B, 理由是每个字段可自描述
    pepesii
        184
    pepesii  
       2019-12-16 21:00:05 +08:00
    两个我都用啊……
    Jackxun123
        185
    Jackxun123  
       2019-12-16 21:04:43 +08:00
    不说需求就是耍流氓
    TesterCC
        186
    TesterCC  
       2019-12-16 21:08:18 +08:00
    关键你得说 A 和 B 为什么这么写,大家才好评论。如果 A、B 同级,那直接去找技术 leader 拍板就对了。
    LemonFlower
        187
    LemonFlower  
       2019-12-16 21:17:45 +08:00 via Android
    (≖_≖ ) 如果 A 是 UniqueID 你们大概就不用吵了吧
    sneezry
        188
    sneezry  
       2019-12-16 21:37:59 +08:00   ❤️ 1
    dynamic key 对静态类型语言太不友好了,无论当前技术栈如何,都尽量避免这么使用。对于 B 在检索上的劣势,通常可以再用一个 hash map 做辅助。
    liuzhiyong
        189
    liuzhiyong  
       2019-12-16 21:55:14 +08:00
    楼主说“我认为 B 写的是对的”,我也认为 B 的写法更好。
    huobazi
        190
    huobazi  
       2019-12-16 21:56:21 +08:00
    赐 A 童鞋一丈绫吧
    realpg
        191
    realpg  
       2019-12-16 21:58:02 +08:00
    如果 A 的程序员不是一个智障的话 那么我会站 A
    我觉得他这么些 一定是逻辑上 IP 地址有作为键的必要
    uyhyygyug1234
        192
    uyhyygyug1234  
       2019-12-16 22:05:39 +08:00
    b 是 excel 里面的表格 a 是 word 里面的表格。。。
    daimubai
        193
    daimubai  
       2019-12-16 22:25:33 +08:00 via iPhone
    投 B 一票,值就是值,用作 key 不舒服
    yilingersier
        194
    yilingersier  
       2019-12-16 22:27:33 +08:00
    b, 如果把每个 obj=> arr, ip 当成 key,解析文件的时候做个 middleware,就和 A 一样了。。我是这么认为的,轻拍
    CodeCore
        195
    CodeCore  
       2019-12-16 22:41:51 +08:00 via iPhone
    @codeismylife A 的写法,Go 比较容易处理。。。其他语言麻烦吧?
    mornlight
        196
    mornlight  
       2019-12-16 22:47:06 +08:00 via iPhone
    尽可能不要让 key 无法预测
    bejond
        197
    bejond  
       2019-12-16 23:02:05 +08:00
    A 最大问题是 key 不可控,数量和 key 值都不可控。这在做接口来看简直是灾难,直接导致客户端懵逼。如果是一个人的项目,自己想怎么来怎么来,但是商业项目,规范性和可维护性是很重要的实现要素。这也能说明为什么 java 比 js 比 python 笨重得多,但是仍然是排名靠前,项目最多的语言。并不是说它多好用,而在于它可控,换谁都能接着写。
    AppxLite
        198
    AppxLite  
       2019-12-16 23:02:56 +08:00
    B, A 就是一坨屎, 木办法同事都是返回 A 给我, 对接这种 api 就像吃屎一样.
    T3RRY
        199
    T3RRY  
       2019-12-16 23:08:00 +08:00
    服了,你竟然不知道如何喷 A ?
    AppxLite
        200
    AppxLite  
       2019-12-16 23:15:55 +08:00
    @qwerthhusn 我觉得刚好相反, 写惯前端的自然知道哪种风格的 api 好, 现实是, 后端因为各种原因, 或是懒, 或是 low, 写出一些恶心的 api.
    1  2  3  4  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2836 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 85ms · UTC 13:25 · PVG 21:25 · LAX 05:25 · JFK 08:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.