JSON语法是否允许在对象中使用重复键?
这是有效的json吗?
{
"a" : "x",
"a" : "y"
}
http://jsonlint.com/说是。
http://www.json.org/并没有说任何关于被禁止的内容。
但显然这没有多大意义,是吗? 大多数实现可能使用散列表,所以它被重写。
从标准(p。ii):
预计其他标准将参考此标准,严格遵守JSON文本格式,同时对各种编码细节施加限制。 这些标准可能需要特定的行为。 JSON本身没有指定行为。
在标准(第2页)中还有一个JSON对象的规范:
一个对象结构被表示为一对围绕零个或多个名称/值对的大括号标记。 名称是一个字符串。 每个名称后跟一个单独的冒号标记,将名称与值分开。 单个逗号令牌将值与以下名称分开。
它没有提到任何重复密钥无效或有效,所以根据规范,我会安全地假设这意味着它们被允许。
由于第一个引用,大多数JSON库的实现不接受重复键不会与标准冲突。
这里有两个与C ++标准库相关的例子。 将一些JSON对象反序列化为std::map
时,拒绝重复键是有意义的。 但是,当将一些JSON对象反序列化为std::multimap
时,接受重复键是正常的。
简短的回答:是的,但不推荐。
漫长的回答:这取决于你所称的有效......
JSON数据交换格式(ECMA-404)没有说明重复名称(密钥)的任何内容。
但是,JavaScript对象表示法(JSON)数据交换格式(RFC7159))说:
对象内的名称应该是唯一的。
在这种情况下,应该按照RFC 2119的规定来理解
应该这个词,或者是“推荐的”形容词,意味着在特殊情况下可能存在一些无效的理由来忽略某个特定的项目,但是在选择不同的课程之前,必须理解并仔细权衡全部含义。
RFC 7159解释了为什么独特的名称(键)是好的:
名称都是唯一的对象在某种意义上是可互操作的
所有接收该对象的软件实现都将同意名称 - 值映射。 当一个对象中的名字不是
独特的,接收这样的对象的软件的行为是
不可预料的。 许多实现报告了姓氏/值对
只要。 其他实现报告错误或无法解析
对象,并且一些实现报告所有的名称/值对,
包括重复。
已经观察到JSON解析库的不同之处在于它们是否使对象成员的顺序对于调用软件可见。 其行为不依赖于成员的实现
从他们不会的意义上说,排序将是可互操作的
受到这些差异的影响。
尝试使用Douglas Crockford(JSON的创建者)的Java实现来解析具有重复名称的字符串会导致一个异常:
org.json.JSONException: Duplicate key "status" at
org.json.JSONObject.putOnce(JSONObject.java:1076)
有2个文件指定JSON格式:
第一份文件中接受的答案引用。 我认为第一份文件更加清晰,但第二份文件包含更多细节。
第二份文件说:
对象
对象结构被表示为围绕零个或多个名称/值对(或成员)的一对大括号。 名称是一个字符串。 单个冒号出现在每个名称后面,将名称与值分开。 一个逗号将一个值与以下名称分开。 对象内的名称应该是唯一的。
所以不要有重复的名字,但是不鼓励。
链接地址: http://www.djcxy.com/p/987.html