这是有效的json吗?
{
"a" : "x",
"a" : "y"
}
http://jsonlint.com/的答案是肯定的。
http://www.json.org/没有说任何关于它是禁止的。
但显然这没什么意义,不是吗? 大多数实现可能使用哈希表,所以无论如何它都会被覆盖。
这是有效的json吗?
{
"a" : "x",
"a" : "y"
}
http://jsonlint.com/的答案是肯定的。
http://www.json.org/没有说任何关于它是禁止的。
但显然这没什么意义,不是吗? 大多数实现可能使用哈希表,所以无论如何它都会被覆盖。
当前回答
According to RFC-7159, the current standard for JSON published by the Internet Engineering Task Force (IETF), states "The names within an object SHOULD be unique". However, according to RFC-2119 which defines the terminology used in IETF documents, the word "should" in fact means "... there may exist valid reasons in particular circumstances to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course." What this essentially means is that while having unique keys is recommended, it is not a must. We can have duplicate keys in a JSON object, and it would still be valid.
从实际应用中,我已经看到,当在JSON中发现重复的键时,会考虑来自最后一个键的值。
其他回答
ECMA JSON标准中没有定义。一般来说,缺乏标准的定义意味着,“不要指望它在任何地方都能以同样的方式工作。”
如果你是一个赌徒,“许多”JSON引擎将允许复制并简单地使用最后指定的值。这样的:
var o = {"a": 1, "b": 2, "a": 3}
变成这样:
Object {a: 3, b: 2}
但如果你不是赌徒,那就别指望了!
问目的,有不同的答案:
使用JSON序列化对象(JavaScriptObjectNotation),每个字典元素映射到一个单独的对象属性,因此不同的条目为同一个属性定义一个值是没有意义的。
然而,我从一个非常具体的用例中得到了同样的问题: 为API测试编写JSON样本,我想知道如何在不破坏可用性的情况下向JSON文件添加注释。JSON规范不知道注释,所以我想出了一个非常简单的方法:
使用重复的键来注释JSON样本。 例子:
{ "property1": "value1", "REMARK": "…"Prop1控制…", "property2": "value2", "REMARK": "…Value2引发异常…", }
我们使用的JSON序列化器对这些重复的“REMARK”没有任何问题,我们的应用程序代码简单地忽略了这个小开销。
因此,尽管在应用层没有任何意义,但这些副本为我们提供了一个有价值的解决方案,可以在不破坏JSON可用性的情况下向测试示例添加注释。
标准是这么说的:
编程语言在是否支持对象和 如果是,对象提供了什么特征和约束。的 对象系统的模型可以有很大的分歧,而且还在继续如此 进化。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格式:
http://json.org/ https://www.rfc-editor.org/rfc/rfc7159
被接受的答案引用自第一个文档。我认为第一份文件更清楚,但第二份文件包含更多细节。
第二份文件说:
对象 对象结构用一对花括号表示 包围零个或多个名称/值对(或成员)。名字就是 字符串。每个名称后面都有一个冒号,分隔名称 从值。一个逗号将值与后面的字符分隔开 的名字。对象中的名称应该是唯一的。
所以不禁止使用重复的名字,但不鼓励使用。
JSON规范是这样说的:
对象是名称/值对的无序集合。
这里重要的部分是“无序的”:它意味着键的唯一性,因为您唯一可以用来引用特定对的是它的键。
此外,大多数JSON库会将JSON对象反序列化为散列映射/字典,其中键是唯一的。反序列化具有重复键的JSON对象时会发生什么情况取决于库:在大多数情况下,您要么会得到一个错误,要么只考虑每个重复键的最后一个值。
例如,在Python中,json。Loads ('{"a": 1, "a": 2}')返回{"a": 2}。