1. ホーム

[解決済み】JSONの構文では、オブジェクト内のキーの重複は許されるのか?

2022-04-03 22:50:01

質問

これは有効なjsonですか?

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

http://jsonlint.com/ は「はい」と答える。

http://www.json.org/ は、禁止されているとは一言も書いていない。

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

どのように解決するのか?

から 規格書(P.2) :

他の規格もこれを参考にし、JSONのテキスト形式を厳密に守りながら は、様々なエンコーディングの詳細について制限を課している。そのような規格は、特定の動作を要求するかもしれません。JSON は動作を規定しない。

規格のさらに下(P.2)に、JSONオブジェクトの仕様があります。

オブジェクトの構造は、0個以上の名前と値のペアを囲む中括弧トークンの組として表現されます。 名前は文字列である。それぞれの名前の後には1つのコロン・トークンが続き、名前と値を分離します。1つの コンマ・トークンは、次の名前と値を分離する。

<イグ

重複キーが無効か有効かについては言及されていませんので、仕様によれば、重複キーは許可されているということだと考えて差し支えないでしょう。

JSON ライブラリのほとんどの実装がそうであること ない は、重複したキーを受け入れても、最初の引用文のおかげで、標準と衝突することはありません。

C++の標準ライブラリに関連する例を2つ紹介します。あるJSONオブジェクトをデシリアライズする際に std::map は、キーの重複を拒否するのが理にかなっています。しかし、あるJSONオブジェクトをデシリアライズする際に std::multimap の場合、重複するキーを通常通り受け入れるのが理にかなっています。