Wie kann man eine Menge in JSON darstellen?

14

JSON unterstützt die folgenden Datenstrukturen (Java-Äquivalente): Skalar, Array / Liste und Map.

A Setwird in JSON nicht sofort unterstützt.

Ich habe über verschiedene Möglichkeiten nachgedacht, eine Menge in JSON darzustellen:

[1] - Als Liste

Allerdings ist eine Liste hat seine eigene Ordnung, so die folgenden zwei Listen, ["a", "b"]und ["b", "a"]ist nicht gleich als Listen, aber sie sollten als Sätze gleich sein.

[2] - Als Karte

Verwenden Sie den Schlüsselsatz der Karte und ignorieren Sie die Werte.

Beim Standardvergleich sind die beiden jedoch nicht mit Karten identisch:

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

[3] - Als Karte mit einem besonderen Wert

Nehmen Sie einen Skalar, sagen Sie 0oder, nullund erzwingen Sie, dass er der Wert jedes Schlüssels in der Karte ist:

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

Auf diese Weise sind unter Standardvergleichstools die Objekte gleich, auch wenn die Schlüsselreihenfolge geändert wird.

Diese Technik verschmutzt jedoch das JSON-Dokument mit irrelevanten Daten.

[4] - Als geordnete Liste

Zurück zum ersten Vorschlag, diesmal jedoch als geordnete Liste. Diese Art löst das Vergleichsproblem.

Wir sollten jedoch auch die Komplexität der Sortierung berücksichtigen und auch, dass die Kartennotation Duplikate behandelt, während dies bei einer sortierten Liste nicht der Fall ist. Beispiel:

{"a": 400, "a": 9}wird so behandelt {"a": 9}, ["g", "g"]wäre es aber immer ["g", "g"].

Abgesehen davon scheint mir die Listennotation klarer zu sein, aber die Map-Notation ist robuster gegenüber der Duplizierung von Schlüsseln und erschwert es, in Bezug auf den speziellen Wert konsistent zu sein (obwohl dies nulleine gute Wahl zu sein scheint).

Was denkst du? Wie würden Sie eine Menge in JSON darstellen?

PS

Beachten Sie, dass es sich bei dieser Frage lediglich um JSON handelt. Ich weiß, dass andere Formate wie Yaml verfügbar sind. Immer noch...

Ron Klein
quelle
1
Sets werden von JSON nicht unterstützt, sie liegen außerhalb des Bereichs. Im Rahmen der Anwendung ist ein Satz oder eine eindeutige, eindeutige Sammlung vorhanden. Da es sich um eine Sammlung handelt, ist es offensichtlicher, die Sammlungssyntax zu verwenden.
Zymus
1
Warum sollten Sie Sets in JSON darstellen? Denken Sie daran, dass JSON ein Austauschformat ist.
Andres F.
@AndresF. Ich dachte, es wäre eine gute Idee, das Eindeutigkeitsattribut der Werte auszudrücken. Ich würde JSON nicht nur an das Austauschformat binden. Es kann auch zur Dokumentenspeicherung nützlich sein (wie in MongoDB).
Ron Klein
@ RonKlein Fair genug. Aber ugh ... lass mich nicht mit MongoDB anfangen: P
Andres F.
In YAML werden Mengen als Ihre Option dargestellt [3], aber es gibt eine spezielle Notation, die JSON nicht hat.
Jasmijn

Antworten:

20

Das kannst du nicht. Wie Sie sagten, können Sie Arrays und Wörterbücher darstellen. Sie haben zwei Möglichkeiten.

Stellen Sie die Menge als Array dar. Vorteil: Die Konvertierung von Set zu Array und zurück ist normalerweise einfach. Nachteil: Ein Array hat eine implizite Reihenfolge, die eine Menge nicht hat. Wenn Sie also identische Mengen in JSON-Arrays konvertieren, können Arrays erstellt werden, die als unterschiedlich angesehen werden. Es gibt keine Möglichkeit, zu erzwingen, dass Array-Elemente eindeutig sind, sodass ein JSON-Array möglicherweise keinen gültigen Satz enthält (offensichtlich können Sie die Duplikate einfach ignorieren; dies ist wahrscheinlich sowieso der Fall).

Stellen Sie die Menge als Wörterbuch mit einem beliebigen Wert pro Schlüssel dar, z. B. 0 oder null. Wenn Sie die Werte einfach ignorieren, ist dies eine perfekte Übereinstimmung. Andererseits haben Sie möglicherweise keine Bibliotheksunterstützung zum Extrahieren der Schlüssel eines Wörterbuchs als Satz oder zum Verwandeln eines Satzes in ein Wörterbuch.

In meiner Programmierumgebung ist die Konvertierung zwischen Set und Array einfacher (das zu setzende Array verliert doppelte Werte, die entweder nicht vorhanden sein sollten oder als korrekt angesehen werden). Aus diesem Grund würde ich mich für Arrays entscheiden. Das ist aber sehr Ansichtssache.

ABER: Es gibt einen großen fetten Elefanten im Raum, der nicht erwähnt wurde. Die Schlüssel in einem JSON-Wörterbuch können nur Zeichenfolgen sein. Wenn Ihr Satz kein Satz von Zeichenfolgen ist, haben Sie nur die Wahl, ein Array zu verwenden.

gnasher729
quelle
4
Der Randfall von Nicht-Strings ist ein gutes Argument gegen ein Wörterbuch.
Ron Klein
3

Versuchen Sie nicht, Mengen in JSON darzustellen. Tun Sie dies stattdessen, wenn Sie die Daten analysieren.

Ihre JSON-Daten sollten ein Schema haben, das angibt, welche Felder als Satz behandelt werden sollen, oder Sie haben möglicherweise Metadaten in die JSON-Daten selbst eingebettet, die beschreiben, wann eine Liste als Satz (z. B. {"houses": {"_type": "set", "value": [...]}}) oder mit einer Namenskonvention behandelt werden soll.

Beachten Sie, dass ein JSON-Objekt gemäß dem JSON-Standard doppelte Schlüssel haben kann. ECMA-404-Formulierungen:

Objekte

[...] Die JSON-Syntax legt keine Einschränkungen für die als Namen verwendeten Zeichenfolgen fest, erfordert nicht, dass Namenszeichenfolgen eindeutig sind, und weist der Reihenfolge der Name / Wert-Paare keine Bedeutung zu. Dies sind alles semantische Überlegungen, die von JSON-Prozessoren oder in Spezifikationen definiert werden können, die bestimmte Verwendungen von JSON für den Datenaustausch definieren.

AFAICD, nichts in der Spezifikation verbietet nicht eindeutige Namen, und es gibt viele JSON-Parser-Implementierungen, die nicht eindeutige Objektnamen analysieren können. RFC 7159 rät von nicht eindeutigen Namen für die Interoperabilität ab, verbietet dies jedoch ausdrücklich nicht und führt weiter auf, wie verschiedene Parser mit nicht eindeutigen Objektnamen umgegangen sind.

Und ECMA 404 erfordert auch nicht, dass die Array-Reihenfolge beibehalten wird:

Arrays

Die JSON-Syntax definiert keine spezifische Bedeutung für die Reihenfolge der Werte. Die JSON-Array-Struktur wird jedoch häufig in Situationen verwendet, in denen die Reihenfolge eine gewisse Semantik aufweist.

Diese Formulierung ermöglicht es Anwendungen, Arrays zur Darstellung von Mengen zu verwenden, wenn sie dies wünschen.

Lie Ryan
quelle