web-dev-qa-db-ja.com

セットをJSONで表す方法は?

JSONは、スカラー、配列/リスト、およびマップのデータ構造(Javaでの同等物)をサポートしています。

Setは、そのままではJSONでサポートされていません。

JSONでセットを表す方法をいくつか考えました。

[1]-リストとして

ただし、リストには独自の順序があるため、次の2つのリスト["a", "b"]および["b", "a"]はリストと同じではありませんが、セットと同じである必要があります。

[2]-地図として

マップのキーセットを使用し、値は無視してください。

しかし、再び、標準的な比較を使用すると、2つはマップと同じではありません。

{"a": "foo", "b": "bar"}{"a": null, "b": null}

[3]-特別な値を持つマップとして

スカラーを取得し、0またはnullと言い、マップ内のすべてのキーの値になるように強制します。

{"a": 0, "b": 0}

このように、標準の比較ツールでは、キーの順序が変更されても、オブジェクトは同じです。

ただし、この手法は、JSONドキュメントを無関係なデータで汚染します。

[4]-順序付きリストとして

最初の提案に戻りますが、今回は順序付きリストです。この種の比較問題を解決します。

ただし、ソートの複雑さも考慮に入れてください。また、ソートされたリストでは処理されないのに対し、マップ表記では重複が処理されます。例:

{"a": 400, "a": 9}{"a": 9}として処理されますが、["g", "g"]は常に["g", "g"]になります。

そうは言っても、リスト表記はより明確であるように思えますが、マップ表記はキーの複製に対してより堅牢であり、特別な値についての一貫性を保つのが難しくなります(nullはそのための良い選択)。

どう思いますか?セットをJSONでどのように表現しますか?

追伸.

これは単にJSONに関する問題であることに注意してください。 yamlのような他のフォーマットも利用できることは知っています。まだ...

14
Ron Klein

まあ、できません。あなたが言ったように、あなたは配列と辞書を表すことができます。 2つの選択肢があります。

セットを配列として表します。利点:通常、セットから配列への変換とその逆の変換は簡単です。短所:配列には暗黙の順序がありますが、セットにはありません。そのため、同一のセットをJSON配列に変換すると、異なると見なされる配列が作成される可能性があります。配列要素が一意であることを強制する方法はないため、JSON配列に有効なセットが含まれていない可能性があります(明らかに、重複を無視することができます。これはとにかく起こりそうなことです)。

セットをディクショナリとして表し、キーごとに任意の値(0またはnullなど)を使用します。値を単に無視する場合、これは完全に一致します。一方、辞書のキーをセットとして抽出したり、セットを辞書に変換したりするためのライブラリサポートがない場合があります。

私のプログラミング環境では、セットと配列の間の変換が簡単です(配列からセットへの変換では、重複する値が失われるはずですが、存在しないか、正しいと見なされます)。そのため、配列を使用します。しかし、それは非常に意見の問題です。

しかし、部屋には言及されていない大きな太った象がいます。 JSON辞書のキーは文字列のみです。セットが文字列のセットでない場合は、配列を使用するしかありません。

20
gnasher729

セットをJSONで表現しないでください。代わりにデータを解析するときに行います。

JSONデータには、どのフィールドをセットとして扱うかを指定するスキーマが必要です。または、リストをセットとして扱う必要があることを説明するメタデータをJSONデータ自体に埋め込むこともできます(例:{"houses": {"_type": "set", "value": [...]}})または命名規則。

JSON標準によれば、JSONオブジェクトは重複したキーを持つ可能性があることに注意してください。 ECMA-404表現:

オブジェクト

[...] JSON構文は、名前として使用される文字列に制限を課さず、名前文字列が一意である必要はなく、名前と値のペアの順序に重要性を割り当てません。これらはすべて、JSONプロセッサによって、またはデータ交換のためのJSONの特定の使用を定義する仕様で定義される可能性がある意味上の考慮事項です。

AFAICD、仕様に非固有名を禁止するものはなく、非固有オブジェクト名を解析できる多くのJSONパーサー実装があります。 RFC 7159は、相互運用性のために一意でない名前を推奨していませんが、具体的にはそれも禁止せず、さまざまなパーサーが一意でないオブジェクト名の処理をどのように見ているかをリストします。

また、ECMA 404では、配列の順序を保持する必要もありません。

配列

JSON構文では、値の順序に特定の意味は定義されていません。ただし、JSON配列構造は、順序付けに意味がある場合によく使用されます。

この表現により、アプリケーションは、配列を使用してセットを表すことができます(選択した場合)。

3
Lie Ryan