it-swarm.com.de

Array von Objekten vs. Objekt von Objekten

Es geht darum, die Kompromisse zwischen folgenden Notationen zu entscheiden:

JSON-basiert:

"users": {
    "id1": {
        "id": "id1",
        "firstname": "firstname1",
        "lastname": "lastname1"
    },
    "id2": {
        "id": "id2",
        "firstaame": "firstname2",
        "lastname": "lastname2"
    }
}

Array-basiert:

users: [
    {
        "id": "id",
        "key2": "value2",
        "key3": "value3"
    },
    {
        "id": "id",
        "key2": "value2",
        "key3": "value3"
    }
]

In Bezug auf this post zum selben Problem habe ich mich (am Frontend) entschieden, die JSON-Objektnotation anstelle eines Arrays von Objekten zu verwenden, da dies meinen Anforderungen entspricht und bessere Leistung und weniger Code im Browser bietet.

Das Problem ist jedoch, dass die Liste selbst nicht statisch ist. Damit meine ich, dass die Liste erstellt wird, d. H. Von DB (NoSQL) abgerufen/gespeichert und für neue Einträge über eine Java-API auf dem Server erstellt wird. Ich kann nicht entscheiden, welche Notation ich am hinteren Ende verwenden soll (was sich letztendlich auch auf die Benutzeroberfläche auswirkt). 

Alle Gedanken/Vorschläge zu Leistung, Wartbarkeit oder Skalierbarkeit werden geschätzt.

46
me_digvijay

Es handelt sich um eine gesamtmeinungsbezogene Frage. Es mag viele andere Punkte geben, aber ich kann darauf hinweisen.

JSON-basierter Ansatz: Wenn ich mich nicht irre, wird dies auf der Serverseite mit Map implementiert.

Advantage: In JavaScript können Sie users.id1, ​​users.id2 direkt verwenden, d. H. Keine Iteration

Nachteil: Auf Clientseite benötigen Sie einige Angaben dazu, wie Sie die in Ihrem JSON vorhandenen IDs benötigen, d. H. Entweder hart codieren oder mit einem dynamischen Ansatz, der Ihnen sagt, welche ID in Ihrem JSON vorhanden ist.


Array-basierter Ansatz: Wenn ich mich nicht irre, wird dies auf der Serverseite mit ArrayList implementiert.

_/ Vorteil:

  1. Auf der Clientseite können Sie direkt durch das Array iterieren, ohne dass __. Im Vorhinein darüber nachgedacht wird, welche ID in dem Array enthalten ist, d. H. Keine harte Kodierung.
  2. Wie durch @JBNizet hervorgehoben, wird der Array-basierte Ansatz die Reihenfolge beibehalten.

Nachteil: Wenn Sie eine einzelne ID abrufen möchten, müssen Sie das Array durchlaufen.

Im Allgemeinen senden wir nicht viele Informationen auf der Clientseite, sodass ein Array-basierter Ansatz kein Problem darstellt. Und das Array in Map umwandeln ist sowohl auf der Seite (Server als auch auf Client) möglich, wenn Sie einen id-basierten Ansatz wünschen.

18
Naman Gala

Auf der Serverseite werden Arrays als einfache Listen gespeichert: ArrayList<Content>, während Objekte entweder als Maps: HashMap<String, Content> oder meistens als Java-Objekte gespeichert werden.

Um Java Entities in und aus JSON zu konvertieren, können Sie einen Blick auf das Jackson - Projekt werfen, das all dies für Sie erledigt.

Ich würde mir keine Leistungsunterschiede zwischen diesen beiden Varianten machen. Es ist wichtiger, eine verständliche, semantische API zu haben, so dass Sie sich eher auf den Geschäftsfall als auf die Leistung stützen sollten.

Wenn Sie Ihr Beispiel betrachten, ist eine Array der bessere Ansatz, da Sie eine Liste von Benutzern anzeigen möchten, die alle gleich sind. Das zweimalige Senden der id macht imho keinen Sinn und erhöht die zu übertragende Datenmenge.

Da Arrays in Java viel einfacher zu speichern und zu iterieren ist, sollten sie außerdem eine bessere Leistung als Objekte bieten.

Einige allgemeine Unterschiede:

  • Arrays erhalten die Reihenfolge
  • Arrays können doppelte Einträge enthalten
  • Objekte haben oft einen größeren Speicher-/Netzwerkaufwand
  • Arrays sind schneller zu durchlaufen (auf der Serverseite)
6
maja

Ein großer Nachteil Ihrer ersten "JSON-basierten" Notation, die Ihnen in den Sinn kommt, ist, dass einige Frameworks Probleme mit der De-Serialisierung haben. Beispielsweise erwartet der DataContractSerializer (C # .NET), dass die Felder id1 und id2 in der Klasse Ihrer Objekte users definiert (fest codiert) sind. Ich bin mir nicht sicher, ob dies auch für einige Java-Frameworks gilt. Vielleicht kann das Framework, das Sie verwenden, es stattdessen als HashMap deserialze.

Insgesamt finde ich die Array-Notation viel intuitiver, wenn es um Iteration usw. geht.

1
Sebastian

Mit object[property]Notation können Sie in JavaScript auf Eigenschaften eines Objekts zugreifen oder diese festlegen.

Gehen Sie mit dem Ansatz von array based am Backend vor und konvertieren Sie das Array in eine Karte (JSON-based, wie Sie sich darauf beziehen) im Frontend.

var list = [{id: "id1", value: "One"}, {id: "id2", value: "Two"}]
var map = {};
list.forEach(function (item) { map[item.id] = item });
map.get("id1")

Wenn sich Ihre Liste ändert, können Sie die neue Liste vom Backend abrufen und Ihre Karte in der Benutzeroberfläche aktualisieren.

Auf diese Weise reagiert Ihr Backend schneller, da es keine Liste in eine Karte konvertieren muss. Ihr Frontend führt eine O(n) - Iteration einmal über der Liste aus, um es in eine Karte zu konvertieren. Dies ist jedoch ein geringer Preis im Vergleich zu O(n), den Sie jedes Mal zahlen, wenn Sie in einer Liste suchen.

Wenn Sie dies tun, erhalten Sie die ID vorwiegend für Ihre Daten am hinteren Ende, indem Sie am Backend selbst JSON Based verwenden. (Sie können LinkedHashMap verwenden, um die Reihenfolge zu erhalten).

0
Foxx

Zusammen mit all den oben genannten technischen Unterschieden gibt es meiner Meinung nach einen grundlegenden Unterschied in Bezug auf Zweck und Bedeutung eines Objekts und eines Arrays.

  1. Die Eigenschaften eines Objekts DESCRIBE/DEFINE das Objekt während
  2. Die Elemente eines Arrays machen NOT DESCRIBE/DEFINE das Array, im Gegenteil, das Array definiert, was sein Inhalt ist. Bitte beachten Sie - ich spreche nicht über technische Aspekte. Sie können technisch beliebige Kombinationen haben, aber semantisch hat jede ihren Zweck.

    • Zum Beispiel ein Kartenhalter. Jede Karte enthält NICHT BESCHREIBEN/DEFINIEREN den Karteninhaber. Aber der Karteninhaber legt fest, dass er nur Karten /

    • Ein Objekt wird verwendet, um eine Entität und ihre Eigenschaften darzustellen DESCRIBE/DEFINE die Entität. Nehmen Sie das gleiche Beispiel einer Karte. Eine Karte hat Eigenschaften wie Farbe, Nummer, die DESCRIBE/DEFINE was die Karte ist.

Für Ihr obiges Beispiel:

  1. Jedes Objekt, das eine Person darstellt wird durch die Eigenschaften definiert id, firstName und lastName.

  2. Eine Liste dieser Personen kann kein Objekt von Objekten sein, weil jede ID beschreibt nicht das Objekt von Objekten. Damit

    "Benutzer": [{"id": "id", "key2": "value2", "key3": "value3"}, {"id": "id", "key2": "value2", "key3 ":" value3 "}]

ist eine bessere Darstellung als

"users": {
    "id1": {
        "id": "id1",
        "firstname": "firstname1",
        "lastname": "lastname1"
    },
    "id2": {
        "id": "id2",
        "firstaame": "firstname2",
        "lastname": "lastname2"
    }
}

obwohl technisch kann man beides nutzen. Ich hoffe, ich konnte mein Denken richtig vermitteln (in Worte fassen).

0
wallop

Beide Ansätze haben ihre Vor- und Nachteile und hängen davon ab, was Sie sich ansehen.

Der Array-Ansatz ist einfach zu serialisieren und ist "Rahmen" -freundlicher (Sie können Beans zu einer Liste hinzufügen und die Liste serialisieren, und Sie sind fertig). So kann beispielsweise ein Webcontainer die Antwort zurückgeben, ohne dass eine Anpassung erforderlich ist. Dies wird wahrscheinlich von den meisten Frameworks sofort unterstützt.

Auf der anderen Seite ist der objektbasierte Ansatz (relativ) schwieriger zu generieren, aber der Schlüssel lässt sich leichter nachschlagen.

Um die Implementierung zu vereinfachen (nach Hersteller), sollten Sie sich für den Array-basierten Ansatz entscheiden. Für die Benutzerfreundlichkeit (konsumiert von Kunden) sollten Sie sich auf einen objektbasierten Ansatz konzentrieren.

0
Ravindra HV