JSON语法是否允许对象中有重复键?

发布于 2021-01-29 20:35:17

这是有效的json吗?

{
    "a" : "x",
    "a" : "y"
}

http://jsonlint.com/表示同意。

http://www.json.org/没有说什么被禁止。

但这显然没有多大意义,对吗?大多数实现可能使用哈希表,因此无论如何都将其覆盖。

关注者
0
被浏览
1017
2 个回答
  • 呼吸                      ༽
    呼吸    ༽ 2021-02-22

    JSON校验可以在https://www.jsonformatting.com/

  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    从标准(第ii页):

    可以预期,其他标准将严格遵循JSON文本格式来引用这一标准,同时对各种编码细节施加限制。此类标准可能需要特定的行为。JSON本身未指定任何行为。

    在标准(第2页)中,进一步介绍了JSON对象的规范:

    对象结构被表示为一对大括号标记,它们围绕零个或多个名称/值对。名称是一个字符串。每个名称后都有一个冒号,将名称与值分隔开。单个逗号标记将值与后面的名称分开。

    它没有提及重复密钥无效或有效,因此根据规范,我可以放心地认为这意味着它们是允许的。

    由于首引号,大多数JSON库实现不接受重复键并不与标准冲突。

    这是与C ++标准库相关的两个示例。将某些JSON对象反序列化为时std::map,拒绝重复的键是有意义的。但是,当将某些JSON对象反序列化为a时std::multimap,可以像往常一样接受重复的键。



  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    简短的答案:是,但不建议这样做。
    长答案:取决于您所说的有效…

    ECMA-404 “ JSON数据交换语法”未提及重复的名称(键)。

    但是,RFC 8259 “ JavaScript对象符号(JSON)数据交换格式”表示:

    对象中的名称应唯一。

    在这种情况下应该作为规定必须理解BCP 14:

    应该使用这个词或形容词“推荐”,这意味着在特定情况下可能存在忽略某个特定项目的正当理由,但是在选择其他课程之前,必须理解并仔细权衡所有含义。

    RFC 8259解释了为什么唯一名称(键)很好:

    从名称接收到的所有软件实现都将在名称-值映射上达成一致的意义上来说,名称都是唯一的对象是可以互操作的。当对象中的名称不是唯一的时,接收到该对象的软件的行为是不可预测的。许多实现仅报告姓/值对。其他实现报告错误或无法解析对象,某些实现报告所有名称/值对,包括重复项。

    另外,正如Serguei在评论中指出的那样:ECMA-262 “ECMAScript®语言规范”的内容如下:

    如果一个对象中有重复的名称字符串,则相同键的词法先前值应被覆盖。

    换句话说,最终值就是胜利。

    Douglas Crockford(JSON的创建者)使用Java实现尝试解析具有重复名称的字符串会导致异常:

    org.json.JSONException: Duplicate key "status"  at
    org.json.JSONObject.putOnce(JSONObject.java:1076)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看