这是有效的json吗?
{
"a" : "x",
"a" : "y"
}
http://jsonlint.com/的答案是肯定的。
http://www.json.org/没有说任何关于它是禁止的。
但显然这没什么意义,不是吗? 大多数实现可能使用哈希表,所以无论如何它都会被覆盖。
这是有效的json吗?
{
"a" : "x",
"a" : "y"
}
http://jsonlint.com/的答案是肯定的。
http://www.json.org/没有说任何关于它是禁止的。
但显然这没什么意义,不是吗? 大多数实现可能使用哈希表,所以无论如何它都会被覆盖。
当前回答
ECMA JSON标准中没有定义。一般来说,缺乏标准的定义意味着,“不要指望它在任何地方都能以同样的方式工作。”
如果你是一个赌徒,“许多”JSON引擎将允许复制并简单地使用最后指定的值。这样的:
var o = {"a": 1, "b": 2, "a": 3}
变成这样:
Object {a: 3, b: 2}
但如果你不是赌徒,那就别指望了!
其他回答
有两个文档指定JSON格式:
http://json.org/ https://www.rfc-editor.org/rfc/rfc7159
被接受的答案引用自第一个文档。我认为第一份文件更清楚,但第二份文件包含更多细节。
第二份文件说:
对象 对象结构用一对花括号表示 包围零个或多个名称/值对(或成员)。名字就是 字符串。每个名称后面都有一个冒号,分隔名称 从值。一个逗号将值与后面的字符分隔开 的名字。对象中的名称应该是唯一的。
所以不禁止使用重复的名字,但不鼓励使用。
标准是这么说的:
编程语言在是否支持对象和 如果是,对象提供了什么特征和约束。的 对象系统的模型可以有很大的分歧,而且还在继续如此 进化。JSON提供了一个简单的表示符号 名称/值对的集合。大多数编程语言都有 一些用于表示此类集合的特性,这些集合可以按名称命名 比如record, struct, dict, map, hash或object。
这个错误至少在node.js中。这段代码在node.js中成功了。
try {
var json = {"name":"n","name":"v"};
console.log(json); // outputs { name: 'v' }
} catch (e) {
console.log(e);
}
JSON规范是这样说的:
对象是名称/值对的无序集合。
这里重要的部分是“无序的”:它意味着键的唯一性,因为您唯一可以用来引用特定对的是它的键。
此外,大多数JSON库会将JSON对象反序列化为散列映射/字典,其中键是唯一的。反序列化具有重复键的JSON对象时会发生什么情况取决于库:在大多数情况下,您要么会得到一个错误,要么只考虑每个重复键的最后一个值。
例如,在Python中,json。Loads ('{"a": 1, "a": 2}')返回{"a": 2}。
在处理一个同时接受XML和JSON的API时,我遇到了一个类似的问题,但没有记录它将如何处理您期望在接受的JSON中出现的重复键。
以下是示例JSON的有效XML表示:
<object>
<a>x</a>
<a>y</a>
</object>
当它被转换成JSON时,你会得到以下内容:
{
"object": {
"a": [
"x",
"y"
]
}
}
从一种处理重复键的语言到另一种语言的自然映射,可以作为这里潜在的最佳实践参考。
希望这能帮助到别人!
应该是独一无二的并不意味着必须是独一无二的。但是,如上所述,一些解析器会失败,而另一些解析器只使用解析的最后一个值。然而,如果规范被清理了一点,允许重复,那么我可以看到一个使用,你可能有一个事件处理程序,将JSON转换为HTML或其他格式…在这种情况下,解析JSON并创建另一种文档格式是完全有效的……
[
"div":
{
"p": "hello",
"p": "universe"
},
"div":
{
"h1": "Heading 1",
"p": "another paragraph"
}
]
然后可以很容易地解析为HTML,例如:
<body>
<div>
<p>hello</p>
<p>universe</p>
</div>
<div>
<h1>Heading 1</h1>
<p>another paragraph</p>
</div>
</body>
我知道这个问题背后的原因,但就目前情况而言……我不会相信它。