根据RFC 4627第2.2: 2.2节。对象
对象结构表示为围绕零或多个名称/值对(或多个成员)的一对花括号。名字是字符串。在每个名称之后加上一个冒号,将名称与值分隔开来。一个逗号将值与下面的名称分隔开来。对象中的名称应该是唯一的.
但是,“应该是独特的”是否符合行业的最佳做法?大多数JSON编码器/解码器是否强制执行“必须是唯一的”。JSONlint.com强制执行“必须是唯一的”。
例如,{ "foo":"value1","foo":"value2“}返回有效的JSON,{ "foo":"value2”}
第二个同名,替换同名的第一个条目。
发布于 2013-11-05 19:39:54
对象中的名称应该是唯一的。
道格拉斯·克罗克福德(作者) 说过
这是RFC最大的失误。应该是必须的。 遗憾的是,修复这一问题为时已晚。
最近的ecma json标准不需要唯一性来避免使确认到rfc并且可能包含重复名称的现有json文档无效。
换句话说,{ "foo":"value1", "foo":"value2" }
是一个有效的json,但是不建议在新的json文档中使用重复的名称。
不同的解析器可以有不同的行为(或者可以配置为不同的行为):
发布于 2013-11-05 20:18:53
无论好坏,规范都允许JSON中的重复名称。
问题是,当遇到这种重复时,解码器的行为是不明确的。
一些解析器将拒绝这种JSON为无效(这是唯一的行为,真正可以说是“错误的”imho)。大多数其他人将返回最后一次遇到的。据我所知,至少有一个JSON (因为我写了它:)严格地将JSON作为一个数据结构,不依赖于任何JavaScript解析规则或执行结果,并允许通过包含对象内的序号索引分别访问每个命名的值(作为通过键名进行访问的一种替代方法,在这种情况下,第一次出现将被返回)。
尽管有些人认为,当构造由JSON描述的对象时,解码器应该复制JavaScript解析器的行为和执行环境(也就是说,最后一个命名的值将覆盖任何早期的同名值),但简单的事实是,JSON只是一个数据结构标准,虽然受到JavaScript语法的启发和引用,但不需要JavaScript执行或反映这种执行的行为。
因此,无论是RFC还是ECMA标准都没有规定解码器在面对重复名称时必须或甚至应该如何行为,因此,除了完全拒绝重复名称的解析器之外,接受重复名称的各种行为都不能说是“正确的”行为。
如果在您自己控制的进程之间生成和使用JSON,那么很可能很容易找到一个适合您的JSON编码器/解码器。但我建议你不要这么做。
这就引出了我的底线:
尽管JSON标准允许复制,但不要求使用它们,因此最明智的方法是避免重复,避免完全创建或遇到问题。:)
https://stackoverflow.com/questions/19803427
复制相似问题