• 请不要在回答技术问题时复制粘贴 AI 生成的内容
kisshere
V2EX  ›  程序员

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

  •  
  •   kisshere · Mar 16, 2022 · 18489 views
    This topic created in 1694 days ago, the information mentioned may be changed or developed.
    我到现在都还没搞明白什么时候该用大括号,什么时候该用中括号,另外,我还是没搞明白 key 到底要不要加引号???加不加引号是否影响各种浏览器兼容性?为什么不像 php7 那样直接全部用中括号,统一格式,简洁明了。这为本来就复杂的前端更加雪上加霜
    Supplement 1  ·  Mar 16, 2022
    给 phper 丢脸了,被喷也值了,我还是去恶补一下前端知识吧
    134 replies  •  2022-03-18 15:23:53 +08:00
    1  2  
    ❮ ❯
    crazytec
    crazytec
    Mar 16, 2022
    1
    json 除了数组以外都是大括号吧(
    xhinliang
    xhinliang
    Mar 16, 2022❤️40
    2
    我只能说没喷到点子上
    mineralsalt
    mineralsalt
    Mar 16, 2022❤️2
    3
    对象用{}, 数组用[]
    Elissa
    Elissa
    Mar 16, 2022
    4
    对象用{},数组用[],至于怎么套娃随便,看业务需求。key 的话,编辑 json 文件的时候不加引号 vscode 报错
    xhinliang
    xhinliang
    Mar 16, 2022❤️10
    5
    PHP 那个数组和 map 混用的 array 还是留给你自己用吧。
    yaott2020
    yaott2020
    Mar 16, 2022 via Android
    6
    哪里反人类了,是 PHP 写多了懒了吧
    Elissa
    Elissa
    Mar 16, 2022
    7
    @crazytec 也可以最外层是数组,随便套娃
    66beta
    66beta
    Mar 16, 2022
    8
    ???
    sampeng
    sampeng
    Mar 16, 2022❤️6
    9
    ????
    数组和对象都没搞明白的人跑来喷 json ?
    BeautifulSoap
    BeautifulSoap
    Mar 16, 2022❤️77
    11
    lz 属于那种 php 写多了,连数组和字典(或 map)都分不清的人了

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

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

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

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

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

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

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

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

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

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



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

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

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

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

    建议学 js 、然后底层语言和高性能各学一个、最好 python 也学一下,虽然多,但是可以慢慢来。
    9c04C5dO01Sw5DNL
    9c04C5dO01Sw5DNL
    Mar 16, 2022
    75
    json 就是 json ,前端要用,后端也要用 (狗头
    summerLast
    summerLast
    Mar 16, 2022
    76
    对于这个语法糖 还是站 json 的写法,原因就是 当用数组'[]'时习惯的期望值是内存的连续空间 ,而使用结构'{}'时则更倾向与离散空间, 这个语法会导致思维的负担
    lancelock
    lancelock
    Mar 16, 2022
    77
    @summerLast php 里压根没有数组,本质都是字典,key 就是 index ,只是被隐藏了。js 也是这样的,不过 js 起码形式上做了区分,php 则完全没区分
    markgor
    markgor
    Mar 16, 2022
    78
    @Rocketer #26 后面那句就不够严谨了....
    数组形式可以通过 length 获取长度,对象形式没有 length 属性。
    nitmali
    nitmali
    Mar 16, 2022
    79
    @markgor 那对于 js 来说 确实数组也是对象
    woomly
    woomly
    Mar 16, 2022
    80
    你这一来,这为本来就容易招黑的 PHP 更加雪上加霜...
    summerLast
    summerLast
    Mar 16, 2022
    81
    @lancelock 哈哈哈,这就是楼主为啥混乱了,数组 字典 明明是一个写法啊
    FrankHB
    FrankHB
    Mar 16, 2022❤️11
    82
    @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
    FrankHB
    Mar 16, 2022
    83
    @FrankHB 淦,合并回复的修改好像被吃了……
    C++ 自带的数组和“字典”(std::unordered_map) 都能用 {} 初始化,而都用 [] 操作符访问元素。
    guanhui07
    guanhui07
    Mar 16, 2022
    84
    PHP 在编程社区风评不好,和你这样的发言脱不了干系
    kooze
    kooze
    Mar 16, 2022❤️3
    85
    难怪之前 phper 我要数组的时候,他给我:
    {
    "0": {...},
    "1": {...},
    "2": {...}
    }
    Felldeadbird
    Felldeadbird
    Mar 16, 2022
    86
    我猜 楼主应该是想表达 PHP 数组 定义爽。例如一个深层的多维数组 $a['b']['c']['d']['e'].... = 1;

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

    JS 里除了 TypedArray 以外的普通 Array 在实现上也是 Object ,元素存储也是 kv 索引
    asuraa
    asuraa
    Mar 16, 2022
    97
    @jessun1990 toml 更好 哈哈 这个我也喜欢
    brazz
    brazz
    Mar 16, 2022❤️1
    98
    为本来就黑的 php 雪上加霜
    dongfang
    dongfang
    Mar 16, 2022
    99
    PHP 程序员连数据结构的最基础的知识都不懂吗?
    大一新生也知道什么是数组,什么是 map 吧???
    keepeye
    keepeye
    Mar 16, 2022❤️1
    100
    我怀疑你是来骗铜币的,但是我没有证据
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5117 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 308ms · UTC 03:47 · PVG 11:47 · LAX 19:47 · JFK 22:47
    ♥ Do have faith in what you're doing.