it-swarm-eu.dev

Wie kann man eine Menge in JSON darstellen?

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

Ein Set wird in JSON nicht sofort unterstützt.

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

[1] - Als Liste

Eine Liste hat jedoch eine eigene Reihenfolge, sodass die folgenden beiden Listen ["a", "b"] und ["b", "a"] sind nicht gleich wie Listen, aber sie sollten gleich wie Mengen 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 0 oder null und erzwinge, dass es 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 behandelt als {"a": 9}, aber ["g", "g"] wäre immer ["g", "g"].

Trotzdem 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 null wie a erscheint gute Wahl dafür).

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

P.S.

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

14
Ron Klein

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: Das Konvertieren 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.

20
gnasher729

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 behandelt werden soll (z. B. {"houses": {"_type": "set", "value": [...]}}) oder mit einer Namenskonvention.

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.

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

3
Lie Ryan