JSON 構文ではオブジェクト内の重複キーが許可されますか? 質問する

JSON 構文ではオブジェクト内の重複キーが許可されますか? 質問する

これは有効なJSONですか?

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

出典: http://www.jsonlint.com/はい、と言います。

http://www.json.org/禁止されているとは何も書かれていません。

しかし、明らかにそれはあまり意味がありませんね。ほとんどの実装ではハッシュテーブルが使用されるため、いずれにせよオーバーライドされます。

ベストアンサー1

簡単に答えると、はい、ただし推奨されません。
詳しく答えると、何が有効かによって異なります...

ECMA-404「JSON データ交換構文」では、重複した名前 (キー) については何も述べられていません。

しかし、RFC 8259「JavaScript Object Notation (JSON) データ交換フォーマット」には次のように書かれています:

オブジェクト内の名前は一意である必要があります。

この文脈では、SHOULDは次のように理解されなければならない。BCP14 について:

SHOULDこの単語、または形容詞「推奨」は、特定の状況では特定の項目を無視する正当な理由が存在する可能性があるが、別の方法を選択する前にその意味を完全に理解し、慎重に検討する必要があることを意味します。

RFC 8259一意の名前 (キー) がなぜ良いのかを説明します。

名前がすべて一意であるオブジェクトは、そのオブジェクトを受け取るすべてのソフトウェア実装が名前と値のマッピングに同意するという意味で相互運用可能です。オブジェクト内の名前が一意でない場合、そのようなオブジェクトを受け取るソフトウェアの動作は予測できません。多くの実装では、最後の名前/値のペアのみが報告されます。その他の実装では、エラーが報告されるか、オブジェクトの解析に失敗します。また、一部の実装では、重複を含むすべての名前/値のペアが報告されます。


また、Serguei がコメントで指摘したように:ECMA-262「ECMAScript® 言語仕様」には次のように書かれています。

オブジェクト内に重複する名前文字列がある場合、同じキーの語彙的に先行する値は上書きされます。

つまり、最後の値が勝ちます。


重複した名前を持つ文字列を解析しようとしていますDouglas Crockford による Java 実装(JSON の作成者)例外が発生する:

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

おすすめ記事