2010-01-21 15 views
6

Tengo la tarea de definir la comunicación entre dos aplicaciones web. Decidí usar JSON para esto. ¿Qué tan común es tener un nodo raíz en el JSON?Root Nodes en JSON

Digamos que tenemos un objeto de automóvil. Este es el JSON con "coche" es el nodo raíz:

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

Así que ahora vamos a decir que tienen un objeto de Tiro y ya que estamos estandarizando en que tienen nodos raíz, éste también tiene que tener.

{"Tire": {"Make": "Brirdgestone", "Size":"15"}} 

La integración del objeto de neumático JSON en el objeto original del automóvil muestra lo difícil que puede ser.

{"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"}} 
]}} 

Así serializado en PHP, la marca del primer neumático sería $object->Car->Tires[0]->Tire->Make. Hay ese nivel de neumático extra allí debido al nodo raíz.

Si Tire no tenía el nodo raíz, el código podría ser mucho más delgado.

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

En PHP, hay menos confusión porque hay menos redundancia: La marca del primer neumático es llamado por $object->Car->Tires[0]->Make

¿Hay algo mal por no tener un nodo raíz? Me gusta tener el nodo raíz porque actúa como un nombre de clase, pero los niveles innecesarios me molestan mucho y hacen que el recorrido sea más complejo.

Respuesta

4

me gustaría omitir ambos nodos raíz, neumáticos y coche.

Tenga en cuenta que el uso principal de JSON es la transferencia de objetos a través de la red en un formato compacto. No hay otro uso real aparte de esto. Desea trabajar con los datos que codifica JSON y al agregar los nodos raíz, está creando objetos contenedores vacíos sin una identidad y propósito real. Cuando Omisión de los nodos raíz, se obtiene

$car->tires[0]->make 

y en JS se obtendría

car.tires[0].make 

Esto es mucho más claro y representa el objeto mucho mejor. Recuerde, esto es con lo que tendrá que trabajar. Claro, podrías usar algún tipo de mapeador JSON que mapee cómo se serializarán los objetos y que resulten en los objetos anteriores, pero eso es mucho esfuerzo adicional y no vale la pena.

Si desea tener el nombre de clase en el JSON, simplemente conviértalo en una propiedad, p.

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

Estoy de acuerdo. Los nodos de raíz simplemente harían innecesariamente detallado el código de la aplicación de consumo. – Steve

+0

Genial, muchas gracias. Pensé en un área donde sería importante. Si el JSON duplica y el documento XML, debe agregar uno al menos en el objeto principal porque en XML, necesita un elemento raíz. Un colega también señaló que es importante para las devoluciones de llamada JSONP y sería una mejor estructura si estuviera creando una API. Por ejemplo, las API de Yahoo y eBay envuelven todo alrededor de un nodo ResultSet. Esto permite a los analizadores que se preocupan por los tipos vincular el ResultSet a un tipo de objeto. –

+0

Bueno, estoy seguro de que puedes pensar en UseCases donde podría ser útil, pero de nuevo, cada vez que utilizaba JSON en mis aplicaciones, tenía devoluciones de llamada que sabían cómo manejar los datos que recibían, p. example.com/cars/find/id/123 devolvería los datos del automóvil y mi devolución de llamada los crearía. – Gordon

0

@Gordon hace buenos puntos. Sin embargo, me gusta usar AOP con mensajes AJAX para interceptar mensajes hacia y desde el servidor. Estos interceptores agregan a cada mensaje una marca de tiempo y en los mensajes enviados desde el servidor un indicador de estado (error, excepción, éxito, lo que sea ...). Como probablemente supusiste, coloque un nodo raíz JSON para la carga útil, el estado y la marca de tiempo.

El indicador de estado enviado desde el servidor se puede examinar en una función (aspecto) en el frente y todas las excepciones manejadas en un solo lugar. Cuando el servidor falla por un motivo que no sea una excepción, el aspecto/consejo permite que los datos se pasen al iniciador AJAX.