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

2023-02-06 09:33:15 +08:00
 tool2d
JavaScript 里,可以这样写 {keyname:123}
而 json 里,就必须这样写 {"keyname":123}

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

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

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

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

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

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

{

prettyPrint: 114514

}

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

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

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

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

(只是个人推测,楼主可以去看看 JSON.parse ()的源码实现方式
Kaier
2023-02-06 09:58:05 +08:00
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
2023-02-06 09:59:04 +08:00
@tool2d js 的 object 跟 JSON 不一样,JSON 相当于字符串了,一个字符串没有经过 parse 也不能当 obj 直接用的。
tool2d
2023-02-06 10:09:32 +08:00
@eason1874 "不是 JSON 多此一举,而是 JS 提供了语法糖,允许你在部分场景省略引号"

JS 是鸡,JSON 是蛋。

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

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

JSON 格式的流行,一大优势就是简单。至于强制引号,是因为 JS 中有大量保留关键字,比如 do ,if 。这样某些情况下必须要有引号,所以作者决定干脆强制引号,这样还更简单。

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

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

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

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

© 2021 V2EX