2011-08-31 18 views
35

Perché sarebbe JSON.stringify() ritorno:JSON.stringify ritorno []

[] 

Lo stesso accade con jQuery: $.JSON.encode()

cosa potrebbe causare questo? Sto passando in un semplice array di oggetti, dove ogni oggetto ha proprietà di stringa. Ho in loop attraverso e allertato oggetti di ogni proprietà e tutto sembra a posto, ma per qualche motivo entrambi i metodi di codifica stanno tornando [].

+11

'JSON.stringify ([]) ===" [] "'. La tua matrice di oggetti è probabilmente vuota. – Gumbo

+0

Non necessario vuoto, ma elementi non enumerabili. – evilpie

+1

Ho risolto questo, sono i tasti dell'array di stringhe. Non posso pubblicare la mia risposta per altre 8 ore. – Chris

risposta

49

nella vostra dichiarazione di matrice

var count_review= new Array() 

al posto di questo uso

var count_review={}; 

Funziona!

+6

Queste due righe non sono le stesse. Il primo è un array, il secondo un oggetto. Array: 'var count_review = [];' ... – War10ck

+1

Se si utilizzano oggetti JavaScript come array associativi (ovvero utilizzando chiavi stringa anziché chiavi int), questa risposta è corretta. – jgerman

+1

L'uso di 'var my_array = []' non funziona per me in questo caso (Android Cordova). Assicurati di usare 'var my_array = {}' anche dopo aver passato un array in seguito. Farlo risolve il problema. –

10

se la matrice dichiarare come "stringa" di ritorno nullo valore chiave

var array = []; 
array['name'] = 'johan'; 
array['age'] = 20; 
alert(JSON.stringify(array))// return [] 

ma se array di dichiarare come stringa di ritorno JSON "int"

var array = []; 
array[0] = 'johan'; 
array[1] = 20; 
alert(JSON.stringify(array))// return["johan",20] 
2

Mentre le risposte di cui sopra sono vere, a completamente capire che ha sicuramente bisogno di più contesto.

JSON è un formato universale (nel senso di supporto di più, si spera tutti i linguaggi di programmazione), che non è del tutto una mappatura 1-a-1 di oggetti JavaScript.

Quindi il motivo principale per cui questo accade è che in JSON (come specificato da RFC 7159) non ci sono array associativi nel senso di JavaScript Array - vale a dire gli array le cui chiavi sono stringhe. Come leggere le specifiche RFC può essere piuttosto in termini di tempo, può essere più facilmente visibile sulla parte superiore del sito JSON.org in cui si dice (alcuni di enfasi di seguito è mio):

JSON è costruito su due strutture:

  • Un insieme di coppie nome/valore. In varie lingue, questo è realizzato come un oggetto , record di, struct, dizionario, tabella hash, elenco con chiave, o array associativo.
  • Un elenco ordinata di valori. Nella maggior parte delle lingue, questo è realizzato come un matrice, vettore, elenco o sequenza.

Si tratta di strutture di dati universali. Praticamente tutti i linguaggi di programmazione moderni li supportano in una forma o nell'altra.È logico che un formato di dati che è intercambiabile con i linguaggi di programmazione sia basato su queste strutture.

In JSON, essi assumono queste forme:

Un oggetto è un non ordinato serie di coppie nome/valore. Un oggetto inizia con { (parentesi sinistra) e termina con } (parentesi graffa destra). Ogni nome è seguito da : (due punti) e le coppie nome/valore sono separate da , (virgola).

JSON Object definition graph

Una matrice è un insieme ordinato di valori. Un array inizia con [ (parentesi sinistra) e termina con ] (parentesi destra). I valori sono separati da , (virgola).

JSON Array definition graph

La funzione JSON.stringify gestisce questa in modo tale che assumendo che matrice è destinato ad essere un array, e tutte le voci con chiave sono annotativa, così come gli elementi che sono oggetti funzione, essi stanno solo gettati fuori dalla rappresentazione JSON restituisce. Sfortunatamente questo comportamento non è documentato in un modo ben definito e facilmente comprensibile nel riferimento non ufficiale di JavaScript che è MDN a partire da oggi (2017-09-04) quindi ecco alcuni frutti a basso impatto se si vuole aiutare il vecchio Mozilla.

Problemi correlati