I'm tasked with defining communication between two web apps. I've decided to use JSON for this. How common is it to have a root node in the JSON?
Let's say we have a car object. This is the JSON with "Car" being the root node:
{"Car": {
"Make":"Mustang",
"YearBuilt":"1999"}}
So now let's say I have a Tire object and since we are standardizing on having root nodes, this one also has to have it.
{"Tire": {"Make": "Brirdgestone", "Size":"15"}}
Integrating the tire object JSON into the original Car object shows how unwieldy it could be.
{"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 serialized in PHP, the make of the first Tire would be $object->Car->Tires[0]->Tire->Make
. There's that extra Tire level there because of the root node.
If Tire did not have the root node the code could be a lot slimmer.
{"Car": { "Make":"Mustang",
"YearBuilt":"1999",
"Tires": "[{ {"Make": "Bridgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}}]}}
In PHP, there's less confusion because there's less redundancy: The make of the first tire is called by $object->Car->Tires[0]->Make
Is there anything bad by not having a root node? I like having the root node because it acts likes a class name, but needless levels bug me a lot and will make traversing more complex.
According to the modified Backus-Naur-Form on the right side pane of http://json.org/ the root element of a JSON data structure can be any of these seven types/values: Object Array String Number true false null.
JSON has three types of nodes, which are Value, Object and Array.
Root element JSON may not start with a root element. JSON supports datatype including integer and strings, JSON also supports array. XML does not provide any data type so needs to be parsed into particular datatype.
Virtual root element:If the incoming JSON document has multiple root elements, enter a virtual root element to be added to the output XML document. This is required because multiple root elements are not valid in XML. Otherwise, the XML parser will fail.
I'd omit both root nodes, Tire and Car.
Keep in mind that JSON's primary use is transfering objects over the network in a compact format. There is no real other usage beside this. You want to work with the data the JSON encodes and by adding the root nodes, you are creating empty container objects with no real identity and purpose. When omiting the root nodes, you get
$car->tires[0]->make
and in JS you'd get
car.tires[0].make
This is much clearer and represents the object much better. Remember, this is what you will have to work with. Sure, you could use some sort of JSON mapper that maps how objects should be serialized and that result in the above objects, but that's a lot of extra effort and not worth it imho.
If you want to have the class name in the JSON, just make it a property, e.g.
{ 'klass': 'Car', 'make': 'Mustang', 'year':1999 }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With