【问题标题】:Why JSON allows only string to be a key?为什么 JSON 只允许字符串作为键?
【发布时间】:2012-03-07 10:51:41
【问题描述】:

为什么 JSON 只允许 string 成为一对键?为什么不是nullnumberboolobjectarray等其他类型?考虑到 JSON 与 JavaScript 密切相关,我可以从 JavaScript 规范(ECMA-262)中得出原因吗?我完全是 JavaScript 新手,你能帮我指出来吗?

【问题讨论】:

  • 我不会说 JSON 是 JavaScript 的一部分。它的数据结构基于 JavaScript 中的对象和数组字面量表示法,但它的存在独立于 ECMA-262。

标签: javascript json ecma262


【解决方案1】:

JSON 格式故意基于 JavaScript 对象字面量语法和数组字面量语法的子集,而 JavaScript 对象只能将字符串作为键 - 因此 JSON 键也是字符串。 (好吧,您可以将数字用作 JavaScript 对象键,但实际上它们会转换为字符串。)

请注意,JSON 的意义在于它是数据的字符串表示形式,以便在不同环境中运行在不同机器上的不同语言编写的程序之间轻松交换。如果您想使用一个对象作为键,那么该对象又必须以某种方式表示为一个字符串以进行传输,但是接收语言需要能够使用对象作为键,这意味着您需要对于那些只会一团糟的语言,JSON 的有限子集。

“考虑到 JSON 是 JavaScript 的一部分”

不,不是。较新的浏览器提供了创建和解析 JSON 的方法,但它们不是这种语言的一部分,只是 JSON 是一种字符串格式,而 JavaScript 可以处理字符串。 JSON 总是 是一种字符串表示形式 - 它必须被解析以创建一个在 JavaScript(或其他语言)中使用的对象,一旦发生这种情况,JavaScript(或其他语言)将结果对象视为任何其他对象。

(另请注意,JSON 的特定位根本不一定有任何键:它可能只是一个数组,例如 '["one","two","three"]'。)

【讨论】:

  • String 在不同语言中几乎是直接支持的,但对象必须是自定义的。我们必须做一些事情来处理来自值的对象,这可能与键的方式相同。如果我们因为跨语言交换容易而限制键只能是字符串,那么就是说值也是这样限制的。我宁愿认为它是 JavaScript 中的副产品。
  • JSON 是为交换数据而设计的。如果您的应用程序的数据非常复杂,以至于您无法找到仅使用基于字符串的键名来表示它的方法,那么我建议您自己做事情太难了。如果您觉得必须将对象作为键,那么您可以在 JSON 中通过包含一个(嵌套的)keys 对象来实现,该对象将基于字符串的属性名称映射到对象,以便这些对象成为某种“虚拟键”。你原来的问题的答案,“为什么只有字符串?”是因为这就是 JSON 的目的所需要的一切,而这正是最初的设计者所决定的。
【解决方案2】:

根据JSON表示的发现者的主要原因是,

在解析 JSON 数据时,有一个机会/可能,key 您用来引用 value 可能是您的 保留字 解析语言。

请参阅 Douglas Crockford 的 talk,他是 JSON 表示的发现者。

示例:

{ 
    id: 1234, 
    name: "foo", 
    do: "somthing"
} 

由于 JSON 是跨语言兼容的,我们可以在多种语言中使用这个数据集。但是,do 这个词是Javascript 中的关键字。解析时会出现语法错误。

【讨论】:

  • 虽然大多数编程语言不会使用数字作为键,但数字也是不允许的。
【解决方案3】:

因为那是规范的编写方式。

【讨论】:

  • 那为什么这么写。一切都是有原因的。
  • @paladin_t -- 不一定。有时这只是作者的偏好。
  • @Hot Licks,这很合理。
  • @paladin_t -- 不一定 -- 许多作家都非常不讲道理。 ;)
  • -- 插入反笑话 chiken meme -- :-)
猜你喜欢
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多