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

JSON 设计得真的反人类,为什么不能像 PHP 数组那样简洁明了?

  •  
  •   kisshere · 109 天前 · 12603 次点击
    这是一个创建于 109 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我到现在都还没搞明白什么时候该用大括号,什么时候该用中括号,另外,我还是没搞明白 key 到底要不要加引号???加不加引号是否影响各种浏览器兼容性?为什么不像 php7 那样直接全部用中括号,统一格式,简洁明了。这为本来就复杂的前端更加雪上加霜
    第 1 条附言  ·  109 天前
    给 phper 丢脸了,被喷也值了,我还是去恶补一下前端知识吧
    134 条回复    2022-03-18 15:23:53 +08:00
    1  2  
    crazytec
        1
    crazytec  
       109 天前
    json 除了数组以外都是大括号吧(
    xhinliang
        2
    xhinliang  
       109 天前   ❤️ 40
    我只能说没喷到点子上
    mineralsalt
        3
    mineralsalt  
       109 天前   ❤️ 2
    对象用{}, 数组用[]
    Elissa
        4
    Elissa  
       109 天前
    对象用{},数组用[],至于怎么套娃随便,看业务需求。key 的话,编辑 json 文件的时候不加引号 vscode 报错
    xhinliang
        5
    xhinliang  
       109 天前   ❤️ 10
    PHP 那个数组和 map 混用的 array 还是留给你自己用吧。
    yaott2020
        6
    yaott2020  
       109 天前 via Android
    哪里反人类了,是 PHP 写多了懒了吧
    Elissa
        7
    Elissa  
       109 天前
    @crazytec 也可以最外层是数组,随便套娃
    66beta
        8
    66beta  
       109 天前
    ???
    sampeng
        9
    sampeng  
       109 天前   ❤️ 6
    ????
    数组和对象都没搞明白的人跑来喷 json ?
    learnshare
        10
    learnshare  
       109 天前   ❤️ 1
    BeautifulSoap
        11
    BeautifulSoap  
       109 天前   ❤️ 77
    lz 属于那种 php 写多了,连数组和字典(或 map)都分不清的人了

    曾经以为写 php 的人分不清数组和字典是个段子,没想到真有这样的人。。。。。
    pendulum
        12
    pendulum  
       109 天前
    我觉得 JSON 挺方便啊,比 YAML 看着更舒服。

    JSON 的 key 都要加双引号,不用加双引号的是 JS 的对象
    lisongeee
        13
    lisongeee  
       109 天前
    key 要不要加引号? 你写的是 json 还是 json5 ?
    kisshere
        14
    kisshere  
    OP
       109 天前
    @BeautifulSoap
    @learnshare 所言极是,我好像确实没分清楚,尴尬了
    ZE3kr
        15
    ZE3kr  
       109 天前 via iPhone
    @sampeng 因为对于 PHP 程序员 dictionary 和 array 是一个东西。

    JSON (JavaScript Object Notation),注意 JS 是啥的缩写。对于 js 程序员来讲就很正常,对于 PHP 程序员来讲就和现代人看文言文一样(只是比喻,没有好坏之分)
    james2013
        16
    james2013  
       109 天前
    ???
    这都分不清的程序员,可能是脑容量太小了
    Leonard
        17
    Leonard  
       109 天前
    不如看看 XML ?
    2NUT
        18
    2NUT  
       109 天前
    建议使用 xml
    undefinedList
        19
    undefinedList  
       109 天前
    @BeautifulSoap #11
    op 大概是只写过 php 吧。。。先入为主的概念~
    Building
        20
    Building  
       109 天前 via iPhone   ❤️ 2
    算是搞清楚了为什么有些 PHP 后台数据结构传过来一团糟,数组和对象都能搞混
    3dwelcome
        21
    3dwelcome  
       109 天前 via Android
    习惯了 xml ,改用 json 后,发现竟然没有对应的数组结构。
    json 转到 xml 不行,xml 转到 json 没问题,真是晕过去。
    darluc
        22
    darluc  
       109 天前
    XML 才是正解
    opengps
        23
    opengps  
       109 天前
    json 的出发点,是相比于 xml 更高密度更低复杂度
    跟数组完全不在一个维度上,不适合用来对比
    kenvix
        24
    kenvix  
       109 天前
    ?被 php 惯坏了这是?
    yazoox
        25
    yazoox  
       109 天前
    JSON 格式,能够如此广泛的被使用,就应该知道它设计是符合当下需求的啊。
    你看 20 年前设计的 xml ,现在还有多少新产品会去用?
    Rocketer
        26
    Rocketer  
       109 天前 via iPhone
    其实严格来说,js 的数组也是对象,开发中用{}代替[]也能用
    BBCCBB
        27
    BBCCBB  
       109 天前
    尴尬了
    Actrace
        28
    Actrace  
       109 天前
    php 的心智负担确实是极低,基本上 array 一把梭,变量类型自动推导。
    所以更换到其它语言的时候,楼主还是需要仔细看一下其它语言的数据类型和数组,并应用在合适的场景。

    所以当你认为 json 反人类的时候,可能你也变成了跟楼下喷 PHP 的那些人一样。

    有一些编程语言虽然不如 php 那样心智负担比较低,但是它们那么设计是有一定的场景需求的(就像汽车的手动挡和自动挡),所以用合适的工具去做合适的事情是一个成熟的人应该具备的能力,不要代入情感和偏见。

    ps. 很多语言都有语法糖,但是可能都不如 php 甜,个人看法。
    littleylv
        29
    littleylv  
       109 天前
    这个世界已经这么黑 PHP 了,OP 不要再给 PHP 招黑了
    murmur
        30
    murmur  
       109 天前
    你不会用格式化吗?
    we8105
        31
    we8105  
       109 天前
    ???
    3dwelcome
        32
    3dwelcome  
       109 天前 via Android
    @yazoox xml 足够简单,就是一棵单根树,很多语言都可以直接导入。属于计算机的基本数据结构。
    json 就比较复杂了,通常跨语言,都需要导入第三方库才能方便使用。
    debuggerx
        33
    debuggerx  
       109 天前   ❤️ 1
    @BeautifulSoap 不光是分不清数组和字典,还不知道返回[]、{}、null 有啥区别:"不一样都是空吗"
    最可怕的还是同一个接口入参不同返回格式能乱变,比如参数 n 大于 5 返回[1,2,3,4,5,6],小于 5 返回{"1": 1, "2": 2, "3": 3},然后还是那句老话:“这不是一回事儿吗”
    Dvel
        34
    Dvel  
       109 天前
    我觉得挺简明的,尤其是写 Python 的时候。。。
    sampeng
        35
    sampeng  
       109 天前   ❤️ 1
    @ZE3kr

    我知道对于初级 php 程序员来说,认为这两个是同一个东西。但是,稍微有点经验的。从心智上是能分得清这两者是有区别的。混在一起只是语法糖,不代表从逻辑上是同一个东西。
    sujin190
        36
    sujin190  
       109 天前   ❤️ 1
    php 的数组才是一大毒瘤啊,大哥,数据结构不明确,各种瞎容错瞎转换,复杂流程中简直不要太坑人
    rekulas
        37
    rekulas  
       109 天前   ❤️ 2
    我主语言也是 php ,接触语言多了之后,你会发现,php 的数组才是反人类
    相比 json 设计很优雅很清晰
    phxsuns
        38
    phxsuns  
       109 天前
    中括号和大括号都分不清嘛?数组和对象区别蛮大的吧。
    siweipancc
        39
    siweipancc  
       109 天前 via iPhone
    害怕
    liuzhaowei55
        40
    liuzhaowei55  
       109 天前 via iPhone
    请不要给 PHP 招黑,我谢谢您了
    rioshikelong121
        41
    rioshikelong121  
       109 天前   ❤️ 14
    找个厂上班吧。🙏
    liushuangbill
        42
    liushuangbill  
       109 天前
    找个厂上班吧。🙏
    ChrisFreeMan
        43
    ChrisFreeMan  
       109 天前 via iPhone
    @rioshikelong121 过分了🐶
    watcher
        44
    watcher  
       109 天前 via iPhone
    简洁明了?
    ysc3839
        45
    ysc3839  
       109 天前 via Android
    JSON 和 PHP 代码中的数组又不是同一类的东西,要比也得跟 PHP 的 serialize 比吧?后者更反人类。
    Ziya
        46
    Ziya  
       109 天前
    @Rocketer {}难道不是无序的?
    spicecch
        47
    spicecch  
       109 天前
    找个厂去打螺丝吧
    maomaosang
        48
    maomaosang  
       109 天前
    确实给 phper 丢脸了,上古 phper 都是能手撸 vanilla js 和 Photoshop 的,哈哈
    encounter2017
        49
    encounter2017  
       109 天前   ❤️ 1
    错误的提问方式❌:我想要实现一个这样的场景,这是我的报错日志,我做了如下尝试,有什么办法可以解决这个问题?

    正确的提问方式✅: A 就是个垃圾,你看我用 B 也能做到一样好(附上错误的实践方式)
    leonidas
        50
    leonidas  
       109 天前
    居然还有喷 PHP 数组的
    用过 GO NODEJS PYTHON JAVA 但我还是觉得 PHP 的数组最香
    imherer
        51
    imherer  
       109 天前
    找个厂上班吧。🙏
    dajj
        52
    dajj  
       109 天前
    json 不支持注释,这个才是痛点
    wenzhonghu
        53
    wenzhonghu  
       109 天前
    json 最大的好处是它是 JavaScript 原生的对象格式啊
    koolob
        54
    koolob  
       109 天前
    php 输出空对象 json 字符串这个逻辑,估计就有不少人写不好。
    rekulas
        55
    rekulas  
       109 天前
    @encounter2017 高情商 👍👍👍 但是不是放反了
    saymoon
        56
    saymoon  
       109 天前
    “简单”不一定“明了”
    luodaoyi
        57
    luodaoyi  
       109 天前
    json 确实不爽
    我更喜欢 yaml
    wdssmq
        58
    wdssmq  
       109 天前
    @dajj #52 VSCode 自己的配置项支持 jsonc ,其他场景认知上感觉都不支持。(╯﹏╰)
    angrylid
        59
    angrylid  
       109 天前 via Android   ❤️ 1
    PHP 在编程社区风评不好,和你这样的发言脱不了干系..
    cweijan
        60
    cweijan  
       109 天前   ❤️ 1
    垃圾 PHP 还来碰瓷别人?
    heyOhayo
        61
    heyOhayo  
       109 天前
    找个厂上班吧
    bigbigpark
        62
    bigbigpark  
       109 天前
    钓鱼贴??
    wdssmq
        63
    wdssmq  
       109 天前   ❤️ 1
    JS 和 PHP 都会一点儿,同不理解楼主在不满啥。。

    JSON 这东西,很多地方都能直接用这点儿很不错,偶尔的偶尔手动编辑下也还算方便。。

    编辑频率高点儿就不如 yaml 了,但是使用时就要需要额外转换。。



    JS 里,能用 v.a 的地方也可以用 v["a"];

    PHP 里该用 $v->a 还是 $v["a"] 要仔细区分就很气人。。
    skymei
        64
    skymei  
       109 天前
    你可别给 PHP 招黑了
    JohnWangggg
        65
    JohnWangggg  
       109 天前
    2333333333333333333
    icylogic
        66
    icylogic  
       109 天前 via iPhone
    感觉 v 友攻击性有点强啊
    arrando
        67
    arrando  
       109 天前
    。。。。。。
    lancelock
        68
    lancelock  
       109 天前
    这跟前端没关系,array 和 dictionary 的概念是普遍的,逻辑上本来就是不一样的结构,为什么要用一样的表示方法,混乱不堪。还有 json 只是数据交换格式,和浏览器兼容性又有什么关系
    fkdtz
        69
    fkdtz  
       109 天前   ❤️ 1
    这。。。楼上喷的够多了,咱就不喷了
    不过其实 PHP 的数组使用 HashTable 来实现的,只不过字典的 key 支持数组和字符串,也就是 PHP 中所谓的索引数组和关联数组。
    所以在用 PHP 数组的时候,实际上都是在操作字典,这可能是楼主分不清大括号和花括号的原因之一。
    raptor
        70
    raptor  
       109 天前
    这是 PHP 的锅,不是 JSON 的锅。

    多学几种语言就知道了,只有 PHP 是字典和数组都用[]的,别的语言都是分别用{}和[]……
    Envov
        71
    Envov  
       108 天前
    {1:{id:1,name:'dasdas'},2:{id:2,name:'dasdas'}}

    [{id:1,name:'dasdas'},{id:2,name:'dasdas'}]
    summerLast
        72
    summerLast  
       108 天前
    @lancelock 没有用过 php,但我好像可以理解为啥这样,哈哈哈 数组变成了字典的子集 如 [0:"a",1:"b",2:"c"] 前面 0 1 2 不写的话可以这样 ["a","b","c"] ,不知 php 是不是这样
    summerLast
        73
    summerLast  
       108 天前
    @summerLast 0 1 2 解释器自动填充,一个语法糖罢了,但是好像这个玩意也可以做成结构的载体 可以做成数组的载体 至于底层内存分配是连续的空间或是离散的则被屏蔽掉了,用起来简单了,但也让楼主分不清为啥这样了,哈哈哈哈
    Hanggi
        74
    Hanggi  
       108 天前
    感觉挺好的,确实可以多学几种语言。

    建议学 js 、然后底层语言和高性能各学一个、最好 python 也学一下,虽然多,但是可以慢慢来。
    giiiiiithub
        75
    giiiiiithub  
       108 天前
    json 就是 json ,前端要用,后端也要用 (狗头
    summerLast
        76
    summerLast  
       108 天前
    对于这个语法糖 还是站 json 的写法,原因就是 当用数组'[]'时习惯的期望值是内存的连续空间 ,而使用结构'{}'时则更倾向与离散空间, 这个语法会导致思维的负担
    lancelock
        77
    lancelock  
       108 天前
    @summerLast php 里压根没有数组,本质都是字典,key 就是 index ,只是被隐藏了。js 也是这样的,不过 js 起码形式上做了区分,php 则完全没区分
    markgor
        78
    markgor  
       108 天前
    @Rocketer #26 后面那句就不够严谨了....
    数组形式可以通过 length 获取长度,对象形式没有 length 属性。
    nitmali
        79
    nitmali  
       108 天前
    @markgor 那对于 js 来说 确实数组也是对象
    woomly
        80
    woomly  
       108 天前
    你这一来,这为本来就容易招黑的 PHP 更加雪上加霜...
    summerLast
        81
    summerLast  
       108 天前
    @lancelock 哈哈哈,这就是楼主为啥混乱了,数组 字典 明明是一个写法啊
    FrankHB
        82
    FrankHB  
       108 天前   ❤️ 11
    @raptor 可能你学得语言还是不够多;你的说法显然不对:C++ 自带的数组和“字典”(std::unordered_map) 都用 [] 操作符访问元素。

    严格来讲,理解偏差完全就不该是 PHP 的锅;问题来自数组(array) 这个概念本身。

    array 这玩意儿作为数据结构在早年( 1950 年代)就极其模糊,但硬要说一般的外延,就是所谓的关联数组(associative array) :一个 key 对应到作为数组元素的 value 的映射。
    用类 ALGOL 语言的习惯来讲,就是能用 [] 的里面塞 key 的东西,所谓 subscritable 。
    至于这个 key 是个整数,来使 [] 里面放 key 取得元素能有明确 O(1) 时间复杂度的随机访问,那是实现细节。用连续存储的线性表实现叫向量(vector) 。
    特别地,向量一般具有确定的静态空间上界。不具有上界限制的线性表叫串(string) 。(虽然严格来讲,数学上的串不一定在乎复杂度要求,不过不少算法实际上隐含了要求。)
    其它实现可以有不同的计算复杂度性质。
    例如二叉搜索树(BST) 可以实现平均 O(log n) 的元素访问,同时在插入和删除元素上比向量更优化。这种索引结构在 C++ 中叫 map ,会跟数学上的映射(map) 产生歧义;之后的一些其它语言改叫字典(dictionary) 。
    而散列表(hash table) 能实现平摊(amortized) O(1) 的访问和增删操作。
    另外还有 Illffe vector 等特定于实现而不常被应用直接使用的数据结构。

    向量因为早年机器实现的开销较小的关系曾经流行过,例如 B 语言自带支持。然而自从抄了 B 的 C 把向量硬叫做数组以后,到处都乱了。
    C 的流行影响了很多语言,导致这些语言设计中的词汇表混乱——该叫向量的不叫向量而叫数组,别的就顺带乾坤大挪移了。典型的像 C++ ,vector 被用于原本叫做 string 的数据结构上,而 string 则用作特指混了 char_traits 这种二道贩子实现细节私货的特定实现。
    以 C 为中心在另一方面也是无耻的;考虑 1957 年就开工的 APL ,(虽然代码模样不咋地)人家混饭吃的核心、不知比你 vector 屌多少倍的 array 就这样被偷换概念了,好意思不?

    所以 PHP 这种设计反而是文艺复兴,恢复了 array 历史上应有的本来面目。

    题外话:
    1.其实向量的 O(1)也就是形式上的。所以广泛使用向量实现数组的语言嘛……
    像 C 都没保证下标访问的复杂度,所以实际上也没禁止实现使用树或者散列表实现内建数组。
    C++倒是隐含了随机访问迭代器 O(1)访问要求,考虑到和内建指针以及数组的关系,实现基本别无选择。但这也不是正经的限制。
    更要命的是一旦放在主存上,主流环境根本无法严格实现。
    典型的宿主(hosted) 实现,不保证实时性,自然不直接提供这种物理上保证 O(1)的例程——比如程序跑一半可能切出去调度了。
    即便不考虑那么流氓的情况,现代 CPU 上的缺页中断里可以允许用户编码明显不 O(1)的非平凡程序,现实也很可能一个程序跑一半换页了结果一个访问突然卡上几百万倍;或者可能有更倒霉的,比如正好放 swap 的机械硬盘有坏道但宿主系统装作系统完整可用的情况——实际上也根本没保证可终止,更别说 O(1)了。
    2.如果忽略修改之类的副作用而只允许构造和访问元素,一元函数(更确切地,映射)和 subscritable 形式的数组同构,都可以用 → 类型构造器表达的类型为其定型(typing) 。所以纯函数式语言不强调数组,是根本不需要。
    FrankHB
        83
    FrankHB  
       108 天前
    @FrankHB 淦,合并回复的修改好像被吃了……
    C++ 自带的数组和“字典”(std::unordered_map) 都能用 {} 初始化,而都用 [] 操作符访问元素。
    guanhui07
        84
    guanhui07  
       108 天前
    PHP 在编程社区风评不好,和你这样的发言脱不了干系
    kooze
        85
    kooze  
       108 天前   ❤️ 3
    难怪之前 phper 我要数组的时候,他给我:
    {
    "0": {...},
    "1": {...},
    "2": {...}
    }
    Felldeadbird
        86
    Felldeadbird  
       108 天前
    我猜 楼主应该是想表达 PHP 数组 定义爽。例如一个深层的多维数组 $a['b']['c']['d']['e'].... = 1;

    换到 JSON 下,就要 { "a": { "c" : { "d" : { "e" { .... : 1 } } } } }
    markgor
        87
    markgor  
       108 天前
    @nitmali #79 为什么非要认为 Array == Object ?
    jessun1990
        88
    jessun1990  
       108 天前
    @luodaoyi 我这里反而不喜欢,主要是缩进不能弄错,编辑文件有点麻烦。我觉得 toml 可能更好些。
    peterjose
        89
    peterjose  
       108 天前
    有个东西叫标准....
    nitmali
        90
    nitmali  
       108 天前
    @markgor 你这样比较有啥意义,你看看 typeof(new Array())
    nitmali
        91
    nitmali  
       108 天前   ❤️ 1
    @markgor 看看原型链就知道 一切都是对象
    kunkunzhang
        92
    kunkunzhang  
       108 天前
    不是前端还是 php 的问题,是你的问题。。。。
    MrYELiex
        93
    MrYELiex  
       108 天前
    @nitmali 这么说显得你前端基础很差....Array 确实是继承 Object 但是 js 实现上本身有连续数组和非连续数组的概念 引擎实现上也会有对应的优化 不然就全部当对象去初始化变量好了 反正 a[1]也一样能用
    nitmali
        94
    nitmali  
       108 天前
    @MrYELiex 我只是说 “那对于 js 来说 确实数组也是对象”,没啥问题
    JaguarJack
        95
    JaguarJack  
       108 天前
    楼上的喷楼主就完事了!为什么要喷 PHP ?够睿智的。
    zthxxx
        96
    zthxxx  
       108 天前
    @fkdtz #69
    @FrankHB #82

    JS 里除了 TypedArray 以外的普通 Array 在实现上也是 Object ,元素存储也是 kv 索引
    luodaoyi
        97
    luodaoyi  
       108 天前
    @jessun1990 toml 更好 哈哈 这个我也喜欢
    brazz
        98
    brazz  
       108 天前   ❤️ 1
    为本来就黑的 php 雪上加霜
    dongfang
        99
    dongfang  
       108 天前
    PHP 程序员连数据结构的最基础的知识都不懂吗?
    大一新生也知道什么是数组,什么是 map 吧???
    keepeye
        100
    keepeye  
       108 天前   ❤️ 1
    我怀疑你是来骗铜币的,但是我没有证据
    1  2  
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2450 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:29 · PVG 14:29 · LAX 23:29 · JFK 02:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.