无论好坏,规范都允许 JSON 中的重复名称。
问题是解码器在面对这种重复时的行为是不确定的。
一些解析器会将此类 JSON 视为无效而拒绝(这是唯一可以说是“错误”恕我直言的行为)。大多数其他人将返回遇到的最后一个。至少我知道的一个(因为我写了它:))将 JSON 严格视为独立于任何 JavaScript 解析规则或执行结果的数据结构,并允许通过包含对象内的序号索引分别访问每个命名值(作为替代通过键名访问,在这种情况下将返回第一次出现)。
尽管有些人认为解码器在构造 JSON 描述的对象时应该复制 JavaScript 解析器和执行环境的行为(也就是说,最后一个命名的值将覆盖任何早期的同名值),但简单的事实是JSON 只是一种数据结构标准,虽然受到 JavaScript 语法的启发和借鉴,但它并不要求 JavaScript 执行或反映这种执行的行为。
因此,RFC 和 ECMA 标准都没有规定解码器在面对重复时必须甚至应该如何表现,因此除了完全拒绝重复名称的解析器之外,接受重复的各种行为都不能说是“正确的” “ 一。
如果您在自己控制的进程之间生成和使用 JSON,那么可能很容易找到一个以适合您的方式工作的 JSON 编码器/解码器并采用它。但我建议不要这样做。
这让我想到了底线:
尽管 JSON 标准允许重复,但它并不要求您使用它们,因此最明智的方法是避免它们并完全避免产生或遇到问题。:)