2010-01-21 11 views
6

Ich bin mit der Definition der Kommunikation zwischen zwei Web-Anwendungen beauftragt. Ich habe mich für JSON entschieden. Wie häufig ist es, einen Wurzelknoten im JSON zu haben?Root Nodes in JSON

Sagen wir, wir haben ein Autoobjekt. Dies ist die JSON mit „Auto“ Knoten die Wurzel zu sein:

{"Car": { 
    "Make":"Mustang", 
    "YearBuilt":"1999"}} 

So, jetzt lassen Sie uns sagen, dass ich einen Reifen bezwecken und da wir mit Root-Knoten werden die Standardisierung auf, das hat man auch, es zu haben.

Die Integration des Reifenobjekts JSON in das ursprüngliche Auto-Objekt zeigt, wie unhandlich es sein könnte.

{"Car": { "Make":"Mustang", 
"YearBuilt":"1999", 
"Tires": "[{"Tire": {"Make": "Brirdgestone", "Size":"15"}}, 
{"Tire": {"Make": "Brirdgestone", "Size":"15"}}, 
{"Tire": {"Make": "Bridgestone", "Size":"15"}}, 
{"Tire": {"Make": "Brirdgestone", "Size":"15"}} 
]}} 

So serialisiert in PHP, die Marke des ersten Reifen würde $object->Car->Tires[0]->Tire->Make sein. Da gibt es diesen zusätzlichen Reifenniveau wegen des Wurzelknotens.

Wenn Tire nicht den Wurzelknoten hatte, könnte der Code viel schlanker sein.

{"Car": { "Make":"Mustang", 
"YearBuilt":"1999", 
"Tires": "[{ {"Make": "Bridgestone", "Size":"15"}}, 
{"Make": "Brirdgestone", "Size":"15"}}, 
{"Make": "Brirdgestone", "Size":"15"}}, 
{"Make": "Brirdgestone", "Size":"15"}}]}} 

In PHP gibt es weniger Verwirrung, weil es weniger Redundanz ist: Die Marke des ersten Reifens durch $object->Car->Tires[0]->Make

genannt wird Gibt es etwas schlecht durch keinen Root-Knoten mit? Ich mag es, den Wurzelknoten zu haben, weil er sich wie ein Klassenname verhält, aber unnötige Ebenen stören mich sehr und machen das Durchqueren komplexer.

Antwort

4

Ich würde beide Wurzelknoten weglassen, Tire und Auto.

Beachten Sie, dass JSON hauptsächlich Objekte in einem kompakten Format über das Netzwerk überträgt. Darüber hinaus gibt es keine andere Verwendung. Sie möchten mit den Daten arbeiten, die JSON codiert, und indem Sie die Stammknoten hinzufügen, erstellen Sie leere Containerobjekte ohne echte Identität und Zweck. Wenn der Wurzelknoten Weglassung, erhalten Sie

$car->tires[0]->make 

und in JS würden Sie

car.tires[0].make 

Das ist viel klarer und stellt bekommen das Objekt viel besser. Denken Sie daran, dass Sie damit arbeiten müssen. Sicher, Sie könnten eine Art von JSON-Mapper verwenden, der darstellt, wie Objekte serialisiert werden sollen und zu den obigen Objekten führen, aber das ist eine Menge zusätzlicher Anstrengung und es lohnt sich nicht imho.

Wenn Sie den Klassennamen im JSON haben möchten, machen Sie einfach eine Eigenschaft, z.

{ 'klass': 'Car', 'make': 'Mustang', 'year':1999 } 
+0

Ich stimme zu. Root-Knoten würden den Code der konsumierenden App nur unnötig ausführlich machen. – Steve

+0

Cool, vielen Dank. Ich dachte an einen Bereich, wo es wichtig wäre. Wenn die JSON-Spiegelung und das XML-Dokument vorhanden sind, sollten Sie mindestens eines für das Hauptobjekt hinzufügen, da Sie in XML ein Stammelement benötigen. Ein Kollege wies auch darauf hin, dass es für JSONP Callbacks wichtig ist und eine bessere Struktur wäre, wenn ich eine API erstellen würde. Zum Beispiel, Yahoo und ebay APIs wickeln alles um einen ResultSet-Knoten herum. Dadurch können Parser, die sich um Typen kümmern, das ResultSet an einen Objekttyp binden. –

+0

Nun, ich bin sicher, Sie können sich UseCases vorstellen, wo es nützlich sein könnte. Aber auch wenn ich JSON in meinen Apps verwendete, hatte ich Callbacks, die wussten, wie sie mit den empfangenen Daten umgehen mussten, z. example.com/cars/find/id/123 würde Auto-Daten zurückgeben und mein Rückruf würde sie erstellen. – Gordon

0

@ Gordon macht gute Punkte. Ich möchte jedoch AOP mit AJAX-Nachrichten verwenden, um Nachrichten vom und zum Server abzufangen. Diese Interzeptoren fügen jeder Nachricht einen Zeitstempel und bei Nachrichten, die vom Server gesendet werden, ein Status-Flag hinzu (Fehler, Ausnahme, Erfolg, was auch immer ...). Wie Sie wahrscheinlich vermutet haben, verwende ich einen Root-JSON-Knoten für die Payload, den Status und den Zeitstempel.

Das vom Server gesendete Status-Flag kann in einer Funktion (Aspekt) am Frontend überprüft und alle Ausnahmen an einer Stelle behandelt werden. Wenn der Server aus einem anderen Grund als einer Ausnahme fehlschlägt, ermöglicht der Aspekt/Advice, dass die Daten an den AJAX-Initiator übergeben werden.

Verwandte Themen