V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tool2d
V2EX  ›  问与答

关于 json 的写法问题,有一点不太理解?

  •  
  •   tool2d · 2023-02-06 09:33:15 +08:00 · 3158 次点击
    这是一个创建于 660 天前的主题,其中的信息可能已经有所发展或是发生改变。
    JavaScript 里,可以这样写 {keyname:123}
    而 json 里,就必须这样写 {"keyname":123}

    多了个双引号,这不是多此一举嘛,有人能告诉我是为什么吗?
    34 条回复    2023-02-07 00:50:58 +08:00
    buxudashi
        1
    buxudashi  
       2023-02-06 09:36:27 +08:00
    为了通用。别的语言
    tool2d
        2
    tool2d  
    OP
       2023-02-06 09:38:34 +08:00
    @buxudashi 我觉得是为了偷懒,既然 javascript 语言能顺利解析 keyname, 没理由别的语言不可以。

    把 json 当成手写配置文件,平白无故多了要打那么多双引号,还不能用单引号替代,就不太开心。
    NotFoundEgg
        3
    NotFoundEgg  
       2023-02-06 09:39:04 +08:00
    {keyname:123} 这个难道不是 js 对象吗,一个是对象一个 string
    kop1989smurf
        4
    kop1989smurf  
       2023-02-06 09:39:05 +08:00
    "JavaScript 里,可以这样写 {keyname:123}"

    没有理解,上文的并不是 JSON ,而是 object 。
    eason1874
        5
    eason1874  
       2023-02-06 09:39:10 +08:00
    JS 也要引号,没有引号,你在中间加个空格试试 🤣
    tool2d
        6
    tool2d  
    OP
       2023-02-06 09:41:38 +08:00
    @eason1874 空格是特殊情况,这个加引号完全能理解。

    日常大部分键名也没有空格,不做兼容,手打很累啊。
    littleylv
        7
    littleylv  
       2023-02-06 09:44:54 +08:00
    上面那个是 JS 的 Object……
    Seulgi
        8
    Seulgi  
       2023-02-06 09:46:21 +08:00
    "JavaScript 里,可以这样写 {keyname:123}"这并不是一个 json ,而是一个 object 。而"{"keyname":123}"这样的 json ,js 也是需要调用函数解析才能成为一个 object
    runze
        9
    runze  
       2023-02-06 09:47:44 +08:00
    @tool2d #2 为了简明易解析,这样才能轻易地被大多数编程语言接受。

    还有哪个复杂一点的数据格式可以放到名片上?

    wu67
        10
    wu67  
       2023-02-06 09:48:48 +08:00
    js 的 object 中, 你写的 key 是会被转成 string 的.
    就像你输入 1 2 这种数字, 也可以用来做键名(虽然正经人不会写这种玩意, 但真的是符合语法的), 但是它会被隐式转换成 string.
    Kirscheis
        11
    Kirscheis  
       2023-02-06 09:49:13 +08:00 via Android   ❤️ 5
    没有引号的话,

    {

    prettyPrint: 114514

    }

    里面的 keyname 到底是 "prettyPrint" 呢,还是 "\n\n prettyPrint"
    oneisall8955
        12
    oneisall8955  
       2023-02-06 09:49:19 +08:00 via Android
    key 可以带其他字符,如空格,-@#%~等
    eason1874
        13
    eason1874  
       2023-02-06 09:51:09 +08:00
    @tool2d #6 我觉得要反过来理解,不是 JSON 多此一举,而是 JS 提供了语法糖,允许你在部分场景省略引号
    oneisall8955
        14
    oneisall8955  
       2023-02-06 09:51:13 +08:00 via Android
    json 不仅仅是手打,也可能是服务端返回的,根据业务逻辑,key 多种多样
    CHUB
        15
    CHUB  
       2023-02-06 09:55:00 +08:00 via Android
    想想不这么写会导致什么后果:

    假设 json 为{k1:123, k2:456},那么请问 k1 的值应该是 123 还是“123, k2:456”?

    总不能学 Python 按照缩进来区分层级结构吧,如果真学 Python ,网络传输的时候会花更多的时间去排版而且容易出错,那还不如继续用 xml ,就没必要推广 JSON 了。

    要想区分不同的 key 和 value ,最简单的办法就是设立分隔符:双引号到下一个冒号之前为 key ,冒号到下一个逗号或者括号为 value 。(然后 value 带双引号的再转换为 string )

    (只是个人推测,楼主可以去看看 JSON.parse ()的源码实现方式
    Kaier
        16
    Kaier  
       2023-02-06 09:58:05 +08:00   ❤️ 1
    Objects 章节第一段中: A name is a string
    https://www.rfc-editor.org/rfc/rfc7159#section-4

    String 章节第一段中: A string begins and ends with quotation marks.
    https://www.rfc-editor.org/rfc/rfc7159#section-7
    CHUB
        17
    CHUB  
       2023-02-06 09:59:04 +08:00 via Android
    @tool2d js 的 object 跟 JSON 不一样,JSON 相当于字符串了,一个字符串没有经过 parse 也不能当 obj 直接用的。
    tool2d
        18
    tool2d  
    OP
       2023-02-06 10:09:32 +08:00
    @eason1874 "不是 JSON 多此一举,而是 JS 提供了语法糖,允许你在部分场景省略引号"

    JS 是鸡,JSON 是蛋。

    应该是先有 JavaScript 语法糖, 后有 JSON 。

    设计理念应该是越来越先进才是,没想到会退化。
    AoEiuV020CN
        19
    AoEiuV020CN  
       2023-02-06 10:15:35 +08:00
    想做肯定是可以做的,参考 json5 ,key 就没有双引号,
    只能说是 json 一开始为了满足 key 是 string ,为了通用,设计出来就是带双引号的,后面不能改了,
    icyalala
        20
    icyalala  
       2023-02-06 10:16:57 +08:00
    按照同样的逻辑,JS 里还可以加注释、还可以单引号、还可以结尾逗号,还可以 nan/inf 等等...
    如果你要这些,可以去看看 https://json5.org/

    JSON 格式的流行,一大优势就是简单。至于强制引号,是因为 JS 中有大量保留关键字,比如 do ,if 。这样某些情况下必须要有引号,所以作者决定干脆强制引号,这样还更简单。
    eaststarpen
        21
    eaststarpen  
       2023-02-06 10:18:30 +08:00
    我在修改机场订阅文件(yaml 格式)的时候遇到个实际的问题

    格式大致如下

    password: !!str 12345678901234456

    其中 !!str 是一个 tag, 表示后面这串字符是一个字符串, 而不是 数字

    在我的 clash 如果去除这个 tag 会将那串字符识别为 float 并报错

    上面的例子相当于:
    password: "12345678901234456"
    icyalala
        22
    icyalala  
       2023-02-06 10:19:35 +08:00
    @icyalala SO 的相关问题,还有原作者回答的视频: https://stackoverflow.com/questions/2067974/in-json-why-is-each-name-quoted
    AoEiuV020CN
        23
    AoEiuV020CN  
       2023-02-06 10:19:53 +08:00   ❤️ 2
    @tool2d #18 json 又不是 javascript++,哪来什么先进,压根就不是一类东西,
    javascript 是编程语言,变量名不允许特殊符号,
    json 的 key 是字符串,允许各种符号,最简单通用安全稳定的表示字符串的做法就是双引号和转义,
    sujin190
        24
    sujin190  
       2023-02-06 10:22:54 +08:00
    @tool2d #18 你搞错了,作为一个为传输编码设计得数据结构来说,写法方便并不重要,都是计算机编码解码的需要啥手写方便,最重要的是需要在任何语言和场景下通用简洁无歧义且尽可能高效,就楼上说的,如果可以省略引号那么处理起来就多狠很多情况需要处理,比如 key 就是引号或者其他特殊字符,作为传输编码的数据结构来说,除了增加编解码复杂度和速度外这样的价值在哪

    此外每个语言都有最方便写 map 的数据结构然后转化为 json ,也就是最符合本语言规范的语法糖,JSON 不止是 JavaScript 的 JSON ,JSON 能得到如此大范围使用是因为其可以非法方便的用于不同场景不同流程不同语言间传递数据,毕竟只有 JavaScript 用着方便毛用没有,而且你确定 JavaScript 的这个语法糖不是一个坑,只是一开始没设计好然后又不好改所以也就将错就错了
    luzemin
        25
    luzemin  
       2023-02-06 10:30:24 +08:00
    问就是 by design
    Mexion
        26
    Mexion  
       2023-02-06 10:33:37 +08:00
    只能说就是这么设计的
    tool2d
        27
    tool2d  
    OP
       2023-02-06 10:58:20 +08:00
    @icyalala 好像 JSON5 完美解决我也提到的这一些痛点。

    看来还是有大佬会改革,灭掉引号的。
    tairan2006
        28
    tairan2006  
       2023-02-06 11:06:38 +08:00
    大哥你在说啥,这明明是 js 的设计问题啊。

    谁告诉你字典的 key 只能是 string 了,我 bool ,int 没有面子的么?
    ywhyme123
        29
    ywhyme123  
       2023-02-06 11:42:37 +08:00
    @tool2d
    js 可以 1 +"1" -> '11'

    别的语言就不行, 快来喷其他语言啊
    wangritian
        30
    wangritian  
       2023-02-06 12:06:32 +08:00
    建议你把精力放在更开阔的地方
    lizy0329
        31
    lizy0329  
       2023-02-06 12:20:33 +08:00
    规定遵守便是,别问为什么
    paranoia
        32
    paranoia  
       2023-02-06 15:52:00 +08:00
    去看了看 JSON5 的 github 主页

    github 上的介绍:JSON5 is an extension to the popular JSON file format
    重点:is an extension

    github 上的介绍:Formally, the JSON5 Data Interchange Format is a superset of JSON
    重点:superset

    本质上还是 json ,其实这也是个语法糖
    leonshaw
        33
    leonshaw  
       2023-02-06 15:58:56 +08:00
    比起少写引号我更想加点注释
    bojackhorseman
        34
    bojackhorseman  
       2023-02-07 00:50:58 +08:00 via iPhone
    啊,我每次都是在 json 里像写 js 一样的写,不加双引号,让格式化程序帮我加🤣
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4507 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 10:11 · PVG 18:11 · LAX 02:11 · JFK 05:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.