Welche JSON-Struktur soll für Schlüsselwertpaare verwendet werden?

23

Welches JSON-Format ist die bessere Wahl für Schlüsselwertpaare und warum?

[{"key1": "value1"}, {"key2": "value2"}]

Oder:

[{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}]

Oder:

{"key1": "value1", "key2": "value2"}

Die erste Variante wirkt kompakter und "semantisch bedeutungsvoller". Die zweite Variante scheint gleichmäßiger strukturiert zu sein, was die Verarbeitung erleichtern könnte. Die 3. Variante wirkt noch semantischer.

Die Schlüsselwertpaare werden verwendet, um beliebige Daten an ein anderes Element anzuhängen. Die Daten müssen als JSON serialisiert werden, um sie durch ein System zu runden.

boot4life
quelle
3
Wenn Sie keine Bestellung benötigen, warum nicht überlegen {"key1": "value1", "key2": "value2"}?
Kennytm
4
JSON ist bereits ein (verschachtelbares) Wörterbuch.
Kasey Speakman
1
Die Beschreibung Ihres Problems ist breit genug, um zu sagen, dass eines dieser Formate funktioniert, und die eigentliche Frage ist, wie der Konsum vereinfacht werden kann, je nachdem, welche Technologien Kunden verwenden.
Skript am
Sie sollten die einfachste verwenden, die Ihren Anforderungen entspricht, hoffentlich die einfache Objektform (# 3). Wenn Sie jedoch nach noch mehr Optionen suchen, können Sie zwei Arrays parallel verwenden, eines für Schlüssel und eines für Werte. Das wird so kompakt wie möglich sein und gleichzeitig Objektschlüssel und doppelte Schlüssel unterstützen (was mit # 3 nicht unterstützt würde).
Erik Eidt

Antworten:

10

Ob Sie die erste oder die dritte Option auswählen, hängt von Ihrem Anwendungsfall ab. Wenn Sie viele verschiedene Instanzen desselben Typs modellieren, wählen Sie die erste aus. Zum Beispiel haben Sie eine Liste von Personen. Wenn Sie viele verschiedene Attribute einer Sache modellieren, wählen Sie die dritte. Sie können Schlüssel im ersten Format wiederholen lassen, aber nicht im dritten.

Die zweite Option ist schrecklich, und ich habe noch keinen geeigneten Anwendungsfall dafür gefunden. Der Grund, warum es schrecklich ist, dass es nicht nur ausführlicher ist, sondern dass es bei einstufigem JSON die automatische Konvertierung der meisten Bibliotheken in ein Wörterbuch / eine Map bricht. Bei tief verschachteltem JSON wird die XPath-ähnliche Abfrageschnittstelle unterbrochen.

Das macht es zu einem Problem, damit zu arbeiten. Wenn Sie Ihre Schlüssel zur Kompilierungszeit nicht kennen, benötigen Sie ein Wörterbuch oder eine XPath-Schnittstelle, da Sie diese nicht in eine Klasse konvertieren können. Es scheint jetzt vielleicht keine große Sache zu sein, aber je länger Sie ein Datenformat haben, desto schwieriger wird es, es zu ändern.

Karl Bielefeldt
quelle
5
Der große Vorteil der zweiten Option besteht darin, dass sie mit Nicht-String-Schlüsseln, insbesondere zusammengesetzten Schlüsseln, funktioniert.
CodesInChaos
1
Die zweite Option ist schrecklich und Sie haben noch keinen Anwendungsfall gefunden? Ein Array von Wörterbüchern mit vielen Schlüssel / Wert-Paaren muss ungefähr das gängigste Format für die Übertragung mehrerer Objekte sein.
gnasher729
2
in Ihrem „gängigste Format“ Fall @ gnasher729, sind die eigentlichen Tasten alle auf der linken Seite: [{"key1": "value1", "key2": "value2"}]. Das zweite Format besteht darin, den echten Schlüssel auf die rechte Seite zu setzen und einen anderen Schlüssel namens "Name" zu verwenden, um auf den echten Schlüssel zu verweisen, was das Parsen mit Standardwerkzeugen äußerst schwierig macht.
Karl Bielefeldt
Ich gebe dir das, @CodesInChaos. Aber auch dort müsste es ein ganz besonderer Fall sein. Ich habe in der Natur noch nie die Notwendigkeit dafür gesehen.
Karl Bielefeldt
3
Sorry, aber das ist eine schlechte Antwort. Die zweite Option wird sehr häufig verwendet und empfohlen. Es ermöglicht die Flexibilität von Schlüsseln, es ermöglicht die Erweiterung (mit mehr Wert- / Metadatenfeldern), ohne die Verbraucher zu unterbrechen, und es kann die Elementreihenfolge beibehalten. Außerdem sind die Gründe dafür falsch: Es unterbricht keine "automatische Konvertierung" (es respektiert lediglich die Präsentation des Autors als Array) und es funktioniert gut mit einer XPath-ähnlichen Abfrageoberfläche. Der einzige Nachteil ist die erhöhte Ausführlichkeit.
Hejazzman
5

Das 3. Format ist im Allgemeinen das beste. Hier ist jedoch ein Beispiel für etwas, das für das 1. Format geeignet ist:

[{
  "username": "foo",
  "id": 1
}, {
  "username": "bar",
  "id": 2
}, {
  "username": "baz",
  "id": 3
}]

Hier bezieht sich jedes Objekt auf eine separate Sache (und jedes Objekt verwendet dieselben Schlüssel wie die anderen, so dass sie nicht zusammengeführt werden konnten). Jedoch wird jedes Objekt in der Liste als gespeichert und { "username": "foo", "id": 1 }nicht , [{ "username": "foo" }, { "id": 1 }]weil 1) es ist kürzer und 2) es mit einem Benutzernamen an eine Sache beziehen und eine ID, nicht eine Sache , mit einem Benutzernamen und eine andere Sache mit einer ID.

Das Problem mit der zweiten Option ist, dass sie sowohl als JSON als auch zum Arbeiten sehr ausführlich wird. Es kann jedoch verwendet werden, wenn Sie Metainformationen über die Eigenschaft speichern müssen. Ein Beispiel:

{
  "key": "foo",
  "value": 1,
  "mutable": true
}

Hier mutablebezieht sich auf einen hypothetischen Fall, ob Sie die Eigenschaft selbst ändern können, nicht das übergeordnete Objekt. Metainformationen wie diese ähneln denen von JavaScript Object.defineProperty, in denen "konfigurierbare", "aufzählbare" und "beschreibbare" Informationen zu einer Eigenschaft gespeichert sind.

Campbell
quelle
Ich habe versucht, das erste Format für JSON zu verwenden, das ich an einen C # REST-Endpunkt gesendet habe, und es wurde nicht in ein Dictionary-Objekt konvertiert. Das Konvertieren in das 3. Format hat das geklärt.
Fizch
5

Sie sagen, dies sind Schlüssel / Wert-Paare. In diesem Fall verwenden Sie # 3: Wörterbuch der Schlüssel / Wert-Paare.

Wenn dies keine Schlüssel / Wert-Paare sind, nennen Sie sie nicht "Schlüssel" und "Werte" und verwenden Sie # 2, ein Array von Wörterbüchern mit beliebigen Inhalten.

Die Struktur 1 ist nur dumm, es sei denn, Sie benötigen Schlüssel / Wert-Paare, aber auch deren Reihenfolge. Was du selten tust.

gnasher729
quelle
3

Versetzen Sie sich in die Lage der Person, die den JSON erhält. Wenn ich den Schlüsselnamen nicht kenne, wie soll ich ihn mit dem ersten oder dem letzten Format abrufen? Sie können den json natürlich durchlaufen, aber da alle drei Formate das gleiche Ergebnis erzielen, ist es nur eine Frage der Syntax. Ich denke, dies ist die einzig sinnvolle Frage: Wenn Sie wissen, dass die Schlüsselnamen die erste oder letzte Option kompakter sind, ist die zweite Wahl verständlicher.

JoulinRouge
quelle