2015-03-03 6 views
5

Gibt es eine Möglichkeit, meine replacer vor eine der angerufenen zu erhalten Objekts eigenen toJSON verwandelt es, so dass ich mit dem ursprünglichen Objekt arbeiten kann, anstatt seine JSON freundliche Form, ohne die toJSON auf dem Objekt oder dessen Prototyp zwingenden , das Objekt vorverarbeiten, oder meine eigene Version von JSON.stringify schreiben? Beispiel: Angenommen, ich möchte Date Instanzen anders als ihre normale Serialisierung (which is toISOString) serialisieren (Diese Frage ist nicht spezifisch Date, das ist nur ein Beispiel.) Das Problem ist, mein replacer nicht das Date Objekt sieht, ist es eine Zeichenfolge sieht (siehe Code-Schnipsel unten), weil Date.prototype.toJSON genannt wird vor meine replacer .Den Ersetzer * vor * dem Objekt toJSON aufrufen?

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>

Gibt es eine Möglichkeit, die replacer ersten genannt zu bekommen? Ich möchte nicht Date.prototype.toJSON überschreiben, das Objekt vorverarbeiten oder meine eigene JSON.stringify schreiben, aber ich sehe keinen anderen Weg.

Antwort

7

Wenn ich verstehe, Sie korrigieren dies den Trick tun sollte, ich bin ziemlich sicher, dass this ist immer das Objekt JSON.stringify derzeit Iterieren über:

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

Schön. Es ist sogar [funktioniert für den Ausnahmefall] (http://jsbin.com/zeciqiwawo/1), wo Sie ein Dokumentfragment ('JSON.stringify (new Date())'), nicht ein ganzes Dokument, danke zu [Schritte 9-11] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3). –

+0

wirklich schön ein .. –

3

Von MDN:

Das Objekt, in dem der Schlüssel gefunden wurde als this Parameter replacer vorgesehen ist.

So können Sie dies tun:

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

Danke. Ich wusste, dass es einen besseren Weg geben musste. :-) –