2015-03-03 8 views
5

C'è un modo per ottenere il mio sostituto chiamato prima di un oggetto proprio toJSON lo trasforma, in modo che possa lavorare con l'oggetto originale piuttosto che sulla forma JSON-friendly, senza sovrascrivendo il toJSON sull'oggetto o il suo prototipo , pre-elaborazione dell'oggetto o scrittura della mia versione di JSON.stringify?Chiama il replacer * prima * toJSON dell'oggetto?

Ad esempio: Si supponga di voler serializzare le istanze Date in modo diverso rispetto alla loro normale serializzazione (which is toISOString). (Questa domanda è non specifico per Date, questo è solo un esempio.) Il problema è che il mio sostituto non vede l'oggetto Date, vede una stringa (vedi frammento sotto) perché Date.prototype.toJSON viene chiamato prima mio sostituto .

var obj = { 
 
    d: new Date() 
 
}; 
 
snippet.log(getType(obj.d));  // "[object Date]" 
 

 
var json = JSON.stringify(obj, function(key, value) { 
 
    if (key === "d") { 
 
    snippet.log(getType(value)); // "string" <== Want to see a Date here 
 
    } 
 
    return value; 
 
}); 
 

 
function getType(value) { 
 
    var to = typeof value; 
 
    if (to === "object") { 
 
    to = Object.prototype.toString.call(value); 
 
    } 
 
    return to; 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

C'è un modo per ottenere il supplente chiamato prima? Non voglio eseguire l'override di Date.prototype.toJSON, pre-elaborare l'oggetto o scrivere il mio JSON.stringify, ma non vedo un altro modo.

risposta

7

se ho ben capito si corregge questo dovrebbe fare il trucco, sono abbastanza sicuro this è sempre l'oggetto JSON.stringify è attualmente l'iterazione oltre:

var json = JSON.stringify(obj, function(key, value) { 
    if (key === "d") { 
    snippet.log(getType(this[key])); 
    } 
    return value; 
}); 
+0

Bello. Persino [funziona per il caso eccezionale] (http://jsbin.com/zeciqiwawo/1) dove stai stringendo un frammento di documento ('JSON.stringify (new Date())'), non un intero documento, grazie a [passaggi 9-11] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3). –

+0

davvero bello .. –

3

Da MDN:

L'oggetto in cui è stato trovato è fornito come parametro del sostituto this la chiave.

Così si può fare questo:

var obj = { 
 
    d: new Date() 
 
}; 
 
snippet.log(getType(obj.d));  // "[object Date]" 
 

 
var json = JSON.stringify(obj, function(key, value) { 
 
    if (key === "d") { 
 
    snippet.log(getType(this[key])); 
 
    } 
 
    return value; 
 
}); 
 

 
function getType(value) { 
 
    var to = typeof value; 
 
    if (to === "object") { 
 
    to = Object.prototype.toString.call(value); 
 
    } 
 
    return to; 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

Grazie. Sapevo che doveva esserci un modo migliore. :-) –

Problemi correlati