2013-03-31 11 views
6

Sto serializzazione di oggetti in stringhe JSON con JavaScript,Perché JSON.stringify non serializza le proprietà non enumerabili?

Ho notato solo le proprietà degli oggetti enumerabili ottenere serializzato:

var a = Object.create(null,{ 
    x: { writable:true, configurable:true, value: "hello",enumerable:false }, 
    y: { writable:true, configurable:true, value: "hello",enumerable:true } 
}); 
document.write(JSON.stringify(a)); //result is {"y":"hello"} 

[pen]

mi chiedo perché? Ho cercato attraverso il MDN page, la documentazione del parser json2. Non ho trovato questo comportamento documentato da nessuna parte.

Ho il sospetto che questo sia il risultato dell'utilizzo dei loop for... in delle proprietà only go through [[enumerable]] (almeno nel caso di json2). Questo può probabilmente essere fatto con qualcosa come Object.getOwnPropertyNames che restituisce entrambe le proprietà enumerabili e non enumerabili. Ciò potrebbe essere problematico per serializzare (a causa della deserializzazione).

tl; dr

  • Perché JSON.stringify serializzare solo le proprietà enumerabili?
  • Questo comportamento è documentato ovunque?
  • Come implementare serializzare proprietà non enumerabili da solo?
+0

Se si imposta enumerabile su false, non verrà aggiunta alcuna istanza. Prova console a loggare l'oggetto prima di stringerlo, e vedrai che 'x' manca all'oggetto stesso, quindi sicuramente non può esserci una volta che è stato modificato. – adeneo

+0

@adeneo che è presumibilmente perché usa anche qualcosa come stringify e non getOwnPropertyNames. Object.getOwnPropertyNames (a) restituisce ["x", "y"] e se si digita obj.x si ottiene "ciao". –

+0

Sì, l'ho notato, ed è una buona indicazione che probabilmente dovresti riconsiderare e trovare un altro modo per creare il tuo oggetto. – adeneo

risposta

9

È specificato nello ES5 spec.

Se Type (valore) è oggetto, e isCallable (valore) è falso

If the [[Class]] internal property of value is "Array" then 

    Return the result of calling the abstract operation JA with argument value. 

Else, return the result of calling the abstract operation JO with argument value. 

Quindi, diamo un'occhiata a JO. Ecco la sezione pertinente:

Sia K un elenco interno di stringhe costituito da nomi di tutte le proprie proprietà di valore il cui [[Enumerable]] attributo è vero. L'ordinamento delle stringhe deve essere uguale a quello utilizzato dalla funzione integrata standard Object.keys.

+1

Ah, non avevo idea che lo stringify facesse parte delle specifiche, questo è esattamente quello che stavo cercando, grazie. –

Problemi correlati