JSON unterstützt die folgenden Datenstrukturen (Java-Äquivalente): Skalar, Array / Liste und Map.
A Set
wird 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 0
oder, null
und 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 null
eine 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...
quelle
Antworten:
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.
quelle
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:
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:
Diese Formulierung ermöglicht es Anwendungen, Arrays zur Darstellung von Mengen zu verwenden, wenn sie dies wünschen.
quelle