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


14

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

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

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

[1]-リストとして

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

[2]-地図として

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

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

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

[3]-マップとして、特別な値で

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

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

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

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

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

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

ただし、並べ替えの複雑さも考慮に入れる必要があります。また、マップ表記は重複を処理しますが、並べ替えリストは処理しません。例:

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

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

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

PS

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


1
セットはJSONではサポートされておらず、スコープ外です。セット、または個別の一意のコレクションは、アプリケーションのスコープ内に存在します。これはコレクションなので、コレクション構文を使用する方がわかりやすいでしょう。
Zymus 2017

1
セットをJSONで表現する理由は何ですか?JSONは交換形式であることを忘れないでください。
アンドレスF.

@AndresF。値の一意性属性を表現するのは良い考えだと思いました。JSONを交換フォーマットだけに結び付けることはしません。また、(MongoDBのような)ドキュメントの保存にも役立ちます。
ロンクライン

@RonKleinフェア十分。しかし、うーん...私にMongoDBを始めさせないでください:P
アンドレスF.

YAMLでは、セットはオプション[3]として表されますが、JSONにはない特別な表記があります。
Jasmijn 2017

回答:


20

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

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

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

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

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


4
非文字列の大文字と小文字の区別は、辞書に対する良い議論です。
ロンクライン

3

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

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

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

オブジェクト

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

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

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

配列

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.