2011-03-15 8 views
25

La siguiente pregunta está relacionada con una pregunta que hice antes: Help parsing simple JSON (using JSON for JAVA ME)¿Las llaves JSON deben ser únicas?

¿Las claves JSON deben ser exclusivas? Por ejemplo, yo estaba teniendo problemas para analizar el siguiente código XML (con JSON ME):

{"name" : "JACK","name" : "JILL","name" : "JOHN","name" : "JENNY","name" : "JAMES","name" : "JIM"} 

Y, al parecer, es porque las claves deben ser únicas. Me pregunto si eso es cierto en todos los casos o no. Por ejemplo, si estuviera usando algo que no sea JSON ME, ¿podría analizar todos estos nombres?

Gracias.

+1

El [JSON RFC] (http://www.ietf.org/rfc/rfc4627.txt) dice "los nombres dentro de un objeto DEBEN ser únicos" por lo que las implementaciones serán diferentes. Puede encontrar uno que tenga reglas más relajadas . – samplebias

Respuesta

33

No hay ningún "error" si utiliza más de una clave con el mismo nombre, pero en JSON, la última clave con el mismo nombre es la que se va a utilizar.

En su caso, la clave "nombre" sería mejor para contener una matriz como su valor, en lugar de tener un número de claves "nombre". No tiene mucho sentido que el mismo objeto o "cosa" tenga dos nombres, o dos de las mismas propiedades que están en conflicto.

ej .:

{ 
    "name" : [ "JOHN", "JACK", "...", ... ] 
} 
+0

Su respuesta se refiere al comportamiento de una implementación en particular y no al estándar JSON. –

3

jQuery puede analizarlo. Pero si intenta acceder, solo devuelve el último valor.

Salida http://jsfiddle.net/MQmM4/2/

lo tanto, es apta para su procesamiento, supongo, pero el valor se anula si se utiliza la misma clave.

1

aquí es una solución posible utilizando matriz. sólo tiene que utilizar índice de matriz

the_json_array.getJSONObject(0); 


{"nameList": 
[{"name" : "JACK"}, 
{"name" : "JILL"}, 
{"name" : "JOHN"}, 
{"name" : "JENNY"}, 
{"name" : "JAMES"}, 
{"name" : "JIM"}]} 
23

De RFC 4627:

Una estructura objeto se representa como un par de llaves circundantes cero o más pares de nombre/valor (o miembros). Un nombre es una cadena . Un solo punto aparece después de cada nombre, separando el nombre del valor. Una coma individual separa un valor del siguiente nombre . Los nombres dentro de un objeto DEBEN ser únicos.

+2

RFC4627 está obsoleto por RFC7159 y dice casi lo mismo. http://stackoverflow.com/questions/21832701/does-json-syntax-allow-duplicate-keys-in-an-object/23195243#23195243 – user454322

1

Un objeto JSON tiene el siguiente

public JSONObject(Map<?, ?> map) { 
    this.map = new HashMap<String, Object>(); 
    if (map != null) { 
     for (final Entry<?, ?> e : map.entrySet()) { 
      final Object value = e.getValue(); 
      if (value != null) { 
       this.map.put(String.valueOf(e.getKey()), wrap(value)); 
      } 
     } 
    } 
} 

Un objeto JSON es básicamente un HashMap que contiene par de valores clave.

Esta es la razón por la que se sobrescribe cada vez.Para evitar esto

  1. O se debe tener claves únicas
  2. O se debe envolver el par de valores clave como objetos individuales en una matriz

un vistazo a este JSON Object java implementation a saber en profundidad sobre JSON.

Cuestiones relacionadas