2011-12-05 15 views
7

Algo me molesta. He usado JSON en algunas de mis aplicaciones/sitios web, ¡a todos nos encanta! Sin embargo algo entrado en mi cabeza hoy que nunca he pensado .. echar un vistazo al siguiente ejemplo (esto es tomado de http://json.org/example.html):Comprender la estructura JSON - atributos y valores

{"widget": { 
    "debug": "on", 
    "window": { 
     "title": "Sample Konfabulator Widget", 
     "name": "main_window", 
     "width": 500, 
     "height": 500 
    }, 
    "image": { 
     "src": "Images/Sun.png", 
     "name": "sun1", 
     "hOffset": 250, 
     "vOffset": 250, 
     "alignment": "center" 
    }, 
    "text": { 
     "data": "Click Here", 
     "size": 36, 
     "style": "bold", 
     "name": "text1", 
     "hOffset": 250, 
     "vOffset": 100, 
     "alignment": "center", 
     "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
    } 
}} 

ahora si este se expresa como XML: tendríamos la siguiente :

<widget> 
    <debug>on</debug> 
    <window title="Sample Konfabulator Widget"> 
     <name>main_window</name> 
     <width>500</width> 
     <height>500</height> 
    </window> 
    <image src="Images/Sun.png" name="sun1"> 
     <hOffset>250</hOffset> 
     <vOffset>250</vOffset> 
     <alignment>center</alignment> 
    </image> 
    <text data="Click Here" size="36" style="bold"> 
     <name>text1</name> 
     <hOffset>250</hOffset> 
     <vOffset>100</vOffset> 
     <alignment>center</alignment> 
     <onMouseUp> 
      sun1.opacity = (sun1.opacity/100) * 90; 
     </onMouseUp> 
    </text> 
</widget> 

al mirar a la transformación de XML JSON me pregunto si es que hay alguna manera de que se puede distinguir si un par ("clave": "valor") son un atributo de una etiqueta. Por ejemplo, en nuestra JSON anterior

"window": { 
      "title": "Sample Konfabulator Widget", 
      "name": "main_window", 

título se representa como un atributo de la etiqueta de la ventana, mientras que el nombre es una etiqueta en su propio derecho, sin embargo, esto no se expresa en cualquier lugar (que puedo ver).

<window title="Sample Konfabulator Widget"> 
    <name>main_window</name> 

¿Por qué no se muestra como esta:

<window> 
    <title>Sample Konfabulator Widget</title> 
    <name>main_window</name> 

Es su manera puedo especificar si un par son un atributo de la etiqueta padre o una etiqueta de niño en su propio derecho? Lo siento si mi redacción es mala o si no me estoy explicando bien.

+1

¿Tiene un esquema XML o algo así? Ni XML ni JSON asignan ningún significado semántico a sus datos. –

+3

La convención más común que vi en muchos transformadores xml-to-json es obtener los atributos comenzando con un @ en el json. eg: '{" window ": {" @title ": ...' – Mic

+0

@Mic - Es una buena manera de hacerlo. Nunca lo había visto antes, pero tu explicación de una oración deja en claro cómo funcionaría. – nnnnnn

Respuesta

1

Algunos convertidores utilizan algunas palabras clave predeterminadas como 'título' y 'src' que se están transformando como un atributo en lugar de un campo. Algunos convertidores no.

+0

Me alegra leer que la gente todavía está pensando ... _Creo que_ algún tipo de referencia para su pensamiento sería genial , entonces podría saber si una herramienta hace esto (= basado en qué especificación) – Philzen

1

No dentro de JSON. Supongo que utilizó algún tipo de forma automática para convertir a XML desde JSON; dependiendo del programa que está haciendo la transformación, puede haber anotaciones que pueda usar. Ver también ej. http://en.wikipedia.org/wiki/JSON que proporciona dos ejemplos XML para el mismo JSON.

No hay ninguna especificación formal (que yo sepa) de cómo "se supone" que mapea JSON a XML. Ambas son formas formalizadas y estructuradas para representar datos, pero dejan las partes concretas de cómo usted representa los datos para usted. Por lo tanto, depende de cómo quiera representar los datos y de qué puede o no tratar su aplicación.

2

Depende de su convertidor.

Json no coincide con XML 1-1.

En pocas palabras, json es solo una forma de representar diccionarios y matrices anidados mutalmente.

0

Acabo de leer este ejemplo exacto en el sitio web json y pensé "cómo es el título título un atributo que no significa que debería. Supongo que el ejemplo en sí no está mal, pero no sé por qué alguien no ha ofrecido una respuesta simple?

2

Algunas personas tienden a usar una propiedad regular llamada "atributos @", que le da el significado especial de "contenedor de atributos", pero ese nombre no tiene ningún significado especial para las especificaciones JSON

Para responder a su pregunta, no hay forma de distinguir entre pares "clave": "valor" y atributos, simplemente porque json no admite atributos.

Este tipo de pregunta generalmente proviene de personas que olvidan que M en XML significa "marcado", que es una forma de tomar texto sin formato y agregar marcado para crear texto estructurado. Supongo que el malentendido se basa en la promoción de JSON como a fat-free alternative to XML, mientras que en realidad XML es un lenguaje de marcado, y JSON es un formato de intercambio de datos. Nadie es realmente una alternativa al otro.

El contenido mixto es uno de los contextos donde XML muestra su poder.

<p>What a <b>mess</b> we're in.</p> 

Tratando de expresar eso como JSON, se dará cuenta de que no fue diseñado para ese trabajo.

Por otro lado, XML puede ser muy útil como intercambiador de datos, pero no es para lo que fue diseñado o sus principales puntos fuertes.

0

Creo que esto es (algo) manejado en ese 'título' y 'descripción' (y 'por defecto') se consideran palabras clave en JSON. JSON realmente no maneja los atributos de esa manera. Creo que la única forma de hacerlo sería agregar otro objeto encapsulante solo para separar 'título' de las otras entradas. Creo que el esfuerzo de JSON por hacer que el "título" y la "descripción" sean especiales es un esfuerzo para lidiar con esto. (No es una maravillosa respuesta, lo sé ....)

https://spacetelescope.github.io/understanding-json-schema/reference/generic.html

0

El objeto "título" en el "Widget/ventana" se generará en un nuevo elemento. Nunca entrará en un atributo de otro elemento. Muy seguro de esto

+0

No estoy seguro de si realmente * responde * a la pregunta. Más bien lee como un comentario que da un poco de información, pero no mucho más. – GhostCat

Cuestiones relacionadas