2012-01-23 28 views
5

Lo siento por mi última pregunta es tan confuso, que estaba confundido mi mismo, pero ahora tengo un buen ejemplo:JSON.stringify (objeto) incorrectos

var obj = {}; 
obj.entities = []; 
obj.entities["player"] = []; 
obj.entities["player"]["0"] = []; 
obj.entities["player"]["0"]["pos"] = "0,0"; 

var jsonStr = JSON.stringify(jsonObj); 

// {"entities":[]} 
console.log(JSON.stringify(obj)); 

La salida de JSON.stringify(obj) está mal como se puede ver . ¿Qué causa esto?

+0

+1 ¡Mucho mejor! ;) –

Respuesta

12

Estás primera construcción de una matriz ([]), entonces la asignación de propiedades a ella con las teclas numéricas (no player). Esto es técnicamente posible (como no causar un error), pero no es para qué sirven las matrices.

En su lugar, debe usar objetos ({}). Además, ["player"] es lo mismo que .player.

var obj = {}; 
obj.entities = {}; 
obj.entities.player = []; // array here because you're filling with indices ([0]) 
obj.entities.player[0] = {}; // object again, because non-indices as keys (`pos`) 
obj.entities.player[0].pos = "0,0"; 

Los objetos pueden tener cualquier clave de propiedad. Las matrices son un subconjunto de objetos, que solo deben tener índices (números >= 0) como claves.

+0

Ah, gracias por la explicación, no estaba completamente al tanto de la diferencia de matriz de objetos. Pero aún puedo hacer 'obj.entities.player = {};' y luego 'obj.entities.player.pos =" 0,0 ";' ¿no podría? –

+0

@ elias94xx: si tienes un jugador, eso sería posible. Aunque el '[" 0 "]' que escribiste me hace suponer que tienes una lista (matriz) de jugadores de alguna manera. – pimvdb

+0

Sí, lo siento, me olvidé de la identificación por un segundo. :) –

1

Está utilizando indeces de matriz con nombre en lugar de pares de clave/valor de objeto.

var obj = {}; 
obj.entities = {}; 
obj.entities["player"] = {}; 
obj.entities["player"]["0"] = []; 
obj.entities["player"]["pos"] = "0,0"; 

// {"entities":{"player":{"0":[],"pos":"0,0"}}} 
console.log(JSON.stringify(obj)); 
1

entities y entities["player"] y entities["player"]["0"] tienen que ser objetos, no matrices.

Está agregando propiedades a estas matrices, en lugar de insertar valores en ellas. Estas propiedades personalizadas no están siendo codificadas.

La solución es simple:

var obj = {}; 
obj.entities = {}; // <------------ this is an object now 
obj.entities["player"] = {}; // <--------- also an object 
obj.entities["player"]["0"] = {}; // <-------- and so on 
obj.entities["player"]["0"]["pos"] = "0,0"; 
3

Su vida sería mucho más fácil si lo desea definir sus objetos en JSON, para empezar:

var obj = { 
    'entities': [ 
    {'player':{'pos': '0,0'}} 
    ] 
}; 
1

yo creo que hay algunas confusiones serias sobre matrices y objetos en Javascript. Una matriz ([]) funciona solo con índices enteros positivos. En el ejemplo que está haciendo lo siguiente:

obj.entities = []; 
obj.entities["player"] = []; 

Usted dice que obj.entities es una matriz y luego se utiliza como índice de player. Y player no es un número entero. Entonces este código no tiene sentido. Por otro lado, podrías usar objetos con propiedades. Esas propiedades pueden ser cadenas:

obj.entities = {}; 
obj.entities.player = []; 
obj.entities.player[0] = 'foo bar'; 
1

Confunde objetos con matrices. El siguiente código funcionará.

var obj = {}; 
obj.entities = {}; 
obj.entities.player = []; 
obj.entities.player[0] = {}; 
obj.entities.player[0].pos = "0,0"; 

las cosas que salió mal:

  1. Una matriz puede tener sólo índices enteros. Por lo tanto, es incorrecto escribir un ["1"] si tiene la intención de utilizar a como una matriz.
  2. Para serializar correctamente, solo un objeto puede tener propiedades con nombre, como object.entities.player o object.entities["player"].
+1

Tenga en cuenta que las claves son siempre cadenas, por lo que no hay diferencia entre '[" 1 "]' o '[1]'. El último es meramente más semántico. – pimvdb

+0

@pimvdb tienes toda la razón – frm

Cuestiones relacionadas