2012-01-23 15 views
5

Scusate per la mia ultima domanda di essere così confusa, ero confuso la mia auto, ma ora ho un vero e proprio esempio:JSON.stringify (oggetto) non corretta

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)); 

L'uscita del JSON.stringify(obj) è sbagliato, come si può vedere . Che cosa causa questo?

+0

+1 Molto migliorato! ;) –

risposta

12

Si sta costruendo prima un array ([]), quindi l'assegnazione delle proprietà ad esso con chiavi non numerici (player). Questo è tecnicamente possibile (come nel non causare un errore), ma non è quello che servono per gli array.

È necessario utilizzare gli oggetti ({}). Inoltre, ["player"] corrisponde a .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"; 

Gli oggetti possono richiedere qualsiasi chiave di proprietà. Le matrici sono un sottoinsieme di oggetti, che dovrebbero avere solo indici (numeri >= 0) come chiavi.

+0

Ah, grazie per la spiegazione, non ero pienamente consapevole della differenza tra gli array di oggetti. Ma potrei ancora fare 'obj.entities.player = {};' e poi 'obj.entities.player.pos =" 0,0 ";' non potrei? –

+0

@ elias94xx: se hai un giocatore, sarebbe possibile. Anche se il '[" 0 "]' che hai scritto mi fa presumere che tu abbia una lista (array) di giocatori in qualche modo. – pimvdb

+0

Sì scusa, ho dimenticato l'id per un secondo. :) –

1

Si stanno utilizzando indici di array nominati anziché coppie di chiavi/valori di oggetti.

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 e entities["player"] e entities["player"]["0"] devono essere oggetti, non array.

Stai aggiungendo le proprietà a questi array, piuttosto che spingere valori su di essi. Queste proprietà personalizzate non vengono rafforzate.

La soluzione è semplice:

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

La tua vita sarebbe molto più facile se ci si definiscono gli oggetti in JSON per cominciare:

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

Penso che tu abbia alcuni gravi confusioni circa array e gli oggetti in JavaScript. Un array ([]) funziona solo con indici interi positivi. Nel tuo esempio si sta facendo quanto segue:

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

Dici che obj.entities è un array e quindi si utilizza player come indice. E player non è un numero intero. Quindi questo codice non ha senso. D'altra parte è possibile utilizzare oggetti con proprietà. Queste proprietà possono essere stringhe:

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

Si confondono gli oggetti con gli array. Il seguente codice funzionerà.

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

le cose che è andato storto:

  1. Un array può avere solo indici interi. Quindi non è corretto scrivere un ["1"] se si intende utilizzare a come matrice.
  2. Per essere serializzati correttamente, solo un oggetto può avere proprietà denominate, come object.entities.player o object.entities["player"].
+1

Nota che le chiavi sono sempre stringhe, quindi non c'è differenza tra '[" 1 "]' o '[1]'. L'ultimo è semplicemente più semantico. – pimvdb

+0

@pimvdb hai assolutamente ragione – frm

Problemi correlati