2015-07-17 11 views
37

Die Frage zu den Kompromissen zwischen folgenden Bezeichnungen entschieden wird:Array von Objekten vs Objekt von Gegenständen

JSON basierten:

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

Array Based:

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

In Bezug auf this Post auf der gleichen Frage habe ich (am Front-End) entschieden, die JSON Ob zu verwenden Je nach Bedarf und besserer Leistung und weniger Code im Browser wird die Notation anstelle von Objekten angezeigt.

Aber das Problem ist, dass die Liste selbst nicht statisch ist. Damit meine ich, die Liste wird erzeugt, d. H. Aus der DB (NoSQL) geholt/gespeichert und für neue Einträge durch eine Java-API auf dem Server erstellt. Ich bin nicht in der Lage zu entscheiden, welche Notation ich am Backend verwenden soll (was letztendlich auch die Benutzeroberfläche betrifft).

Alle Gedanken/Vorschläge über Leistung, Wartbarkeit oder Skalierbarkeit sind willkommen.

+2

Wie vergleichen Sie diesen Ansatz? In JSON basiert man Werte als ID und in Array basiert man es als Array. Was ist Ihre Anforderung? –

+1

In Javascript kann ich das Objekt mit der 'id' (für JSON) erhalten, aber im Falle von Array muss ich die ganze Liste durchlaufen und die 'id' Eigenschaft jedes Objekts anpassen, was im Falle von große Datenmengen. JSON funktioniert also gut für mich im Browser, aber ich bin mir nicht sicher, ob das Erstellen der gleichen Struktur von Java irgendwelche Leistungsprobleme haben wird. –

+1

Wie unterstützt Ihr JSON-Ansatz mehrere Benutzereingaben? –

Antwort

17

Es ist eine totale meinungsbasierte Frage. Es könnte viele andere Punkte geben, aber ich kann darauf hinweisen, wie unten.

JSON basierter Ansatz: Wenn ich nicht falsch bin, dann wird dies auf Server-Seite mit Map implementiert werden.

Vorteil: In JavaScript können Sie direkt verwenden users.id1, ​​users.id2 dh ohne die Notwendigkeit einer Iteration

Nachteil: Auf Client-Seite, einige, wie Sie die IDs in Ihrem JSON also vorhanden erfordern Entweder Sie programmieren es hart oder Sie verwenden einen dynamischen Ansatz, der Ihnen sagt, welche ID in Ihrem JSON vorhanden ist.


Array Based Ansatz: Wenn ich mich nicht irre, dann wird dies Array/List auf Serverseite implementiert werden.

Vorteil:

  1. auf Client-Seite kann man direkt durch Array iterieren, ohne vorab sich Gedanken über die ID im Inneren ist es d.h. keine harte Codierung.
  2. Wie von @ JBNizet hingewiesen, Array-basierten Ansatz wird die Reihenfolge beibehalten.

Nachteil: Wenn Sie Single-ID holen wollen, dann müssen Sie durch das Array zu durchlaufen.

Im Allgemeinen senden wir nicht viele Informationen auf Client-Seite, so Array-basierten Ansatz wird kein Problem erstellen. Und Umwandlung Array in Karte ist sowohl auf der Seite (Server und Client) möglich, wenn Sie ID-basierten Ansatz wollen.

+0

Dies sind nette Pints, aber ich bin mehr besorgt darüber, was auf dem Server passiert. –

+2

Der hard-code Teil ist nicht wirklich ein Problem. Sie können auch ein Objekt 'for (key in obj)' durchlaufen und die Schlüsselwerte konfigurierbar machen. Aber ich bezweifle, dass das überhaupt nötig wäre. – maja

+0

@maja: Eigentlich muss ich nicht über den Schlüssel der Objekte iterieren. Ich habe bereits die Schlüssel (die nicht fest codiert sind). –

5

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

Um Java-Entities von und nach JSON zu konvertieren, können Sie sich das Projekt Jackson ansehen, das alles für Sie erledigt.

Ich mache mir keine Sorgen über Leistungsunterschiede zwischen diesen beiden Varianten. Es ist wichtiger, eine verständliche, semantische API zu verwenden. Daher sollten Sie Ihre Entscheidung eher auf den Geschäftsfall als auf die Leistung beziehen.

bei Ihrem Beispiel Sehen, denke ich, ein Array der bessere Ansatz ist, da Sie eine Liste der Benutzer zurückkehren wollen, die alle gleich sind. Das zweimalige Senden der ID macht imho keinen Sinn und erhöht die Menge der Daten, die übertragen werden müssen.

Darüber hinaus, da Arrays sind viel einfacher zu speichern und in Java zu iterieren, sollten sie auch eine bessere Leistung als Objects bieten.

Einige allgemeine Unterschiede:

  • Arrays erhalten die Reihenfolge
  • Arrays doppelte Einträge
  • Objekte haben oft einen größeren Speicher/Netzwerk-Overhead
  • Arrays sind schneller (auf iterieren enthalten die Serverseite)
1

Ein großer Nachteil Ihrer ersten "JSON-basierten" Notation, die mir in den Sinn kommt, ist, dass einige Frameworks Probleme mit der (De-) Serialisierung haben. Zum Beispiel werden die DataContractSerializer (C# .NET) erwarten, dass die Felder id1 und id2 bis (fest einprogrammiert) in der Klasse der Objekte users definiert werden. Ich bin mir nicht sicher, ob dies auch für einige Java-Frameworks gilt. Vielleicht wird das Framework, das Sie verwenden, es stattdessen als HashMap deserialisieren können.

Insgesamt würde ich die Array-Notation viel intuitiver finden, mit zu arbeiten, wenn es um Iteration kommt usw.

0

Sie object[property]notation verwenden können, um Zugriff auf oder legen Sie die Eigenschaften in einem Objekt in JavaScript.

Go mit Array basierten Ansatz im Backend und wandelt das Array zu einer Karte (JSON basierten, wie Sie sich darauf beziehen) im vorderen Ende.

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

Wenn Ihre Liste ändert, können Sie die neue Liste von Backend erhalten und Ihre Karte in UI aktualisieren.

Auf diese Weise Ihre Backend schneller zu reagieren, da es nicht die Liste auf eine Karte konvertieren muss. Ihr Frontend führt eine O (n) Iteration einmal über die Liste, um es in eine Karte zu konvertieren. Aber das ist ein kleiner Preis im Vergleich zu O (n) Sie zahlen jedes Mal, wenn Sie auf einer Liste suchen.

Wenn Sie überwiegend von id wird am hinteren Ende auf Ihre Daten erhalten tun gehen mit JSON Basierend im Backend selbst (Sie LinkedHashMap Auftrag erhalten verwenden können).

0

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

Der Array-Ansatz ist einfach zu serialisieren und ist mehr "Framework" -freundlich (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 standardmäßig unterstützt.

Auf der anderen Seite ist der objektbasierte Ansatz schwieriger zu generieren (relativ), aber es ist leichter zu suchen, da der Schlüssel bekannt ist.

Für die einfache Implementierung (nach Hersteller), gehen Sie für den Array-basierten Ansatz. Zur einfacheren Verwendung (von Clients verwendet) wählen Sie den objektbasierten Ansatz.