根据RFC 4627的JSON对象名称的唯一性

时间:2013-11-06 03:14:25

标签: json rfc4627

根据RFC 4627第2.2节: 2.2。对象

对象结构表示为一对花括号    包含零个或多个名称/值对(或成员)。名字是    串。每个名称后面都有一个冒号,分隔名称    从价值。单个逗号将值与后续值分开    名称。 对象中的名称应该是唯一的。

但是“应该是独一无二的”符合行业最佳实践吗?大多数JSON编码器/解码器都强制执行“必须是唯一的”。 JSONlint.com强制执行“必须是唯一的”。

例如{“foo”:“value1”,“foo”:“value2”}返回Valid JSON, {   “富”:“值2” }

第二个同名,取代了同名的第一个条目。

2 个答案:

答案 0 :(得分:2)

rfc 4627

  

对象中的名称应该是唯一的。

Douglas Crockford(作者)said about it

  

这是RFC中最大的错误。应该是必须的。

     

遗憾的是,要修复它已经太晚了。

recent ecma json standard并不需要唯一性,以避免使确认rfc且可能包含重复名称的现有json文档无效。

换句话说,{ "foo":"value1", "foo":"value2" }是一个有效的json,但不建议在新的json文档中使用重复的名称。

不同的解析器可以表现不同(或者可以配置为表现不同):

答案 1 :(得分:1)

对于好或坏,规范允许使用JSON中的重复名称。

问题是解码器在面对这样的重复时的行为是未定义的。

有些解析器会将这样的JSON拒绝为无效(这是唯一可以说是“错误”的行为)。大多数其他人将返回遇到的最后一个。至少有一个我所知道的(因为我写了:))将JSON严格地视为独立于任何JavaScript解析规则或执行结果的数据结构,并允许通过包含对象内的序数索引分别访问每个命名值(作为替代)通过密钥名称访问,在这种情况下将返回第一个事件。)

虽然有些人认为解码器应该在构造JSON描述的对象时复制JavaScript解析器和执行环境的行为(也就是说,最后一个命名的值会覆盖任何早期的同名值)事实上,JSON只是一种数据结构标准,虽然受到JavaScript语法的启发和借鉴,但并不要求JavaScript执行或反映此类执行的行为。

因此,RFC和ECMA标准都没有规定解码器在面对重复时必须或甚至应该如何表现,因此除了完全拒绝重复名称的解析器之外,接受重复的各种行为都不能说是 “正确”的一个。

如果您在自己控制的进程之间生成和使用JSON,那么可能很容易找到一个适合您的JSON编码器/解码器并继续使用它。但我会反对它。

这让我想到了底线:

虽然JSON标准允许重复,但它不会要求您使用它们,因此最明智的路径就是避免它们并避免完全创建或遇到问题。 :)