2015-03-03 15 views
5

Czy istnieje sposób, aby mój zamiennik o nazwie przed obiekt własnego toJSON przekształca go tak, że mogę pracować z oryginalnego obiektu, a nie jego JSON w obsłudze formie, bez przesłanianie toJSON na obiekcie lub jego prototyp , wstępne przetwarzanie obiektu lub pisanie własnej wersji JSON.stringify?Zadzwoń do zamiennika * przed * obiektem do JSON?

Na przykład: Załóżmy, że chcę serializować instancje Date w inny sposób niż ich normalna serializacja (which is toISOString). (To pytanie jest nie specyficzne Date, to tylko przykład). Problem polega na tym, mój zamiennik nie widzi obiekt Date, widzi napis (patrz poniżej urywek), ponieważ Date.prototype.toJSON nazywa przed mój zamiennika .

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>

Czy istnieje sposób, aby uzyskać zamiennik o nazwie pierwszy? Nie chcę przesłonić obiektu Date.prototype.toJSON, wstępnie przetworzyć obiektu ani napisać własnego JSON.stringify, ale nie widzę innego sposobu.

Odpowiedz

7

Jeśli rozumiem skorygować to powinno załatwić sprawę, jestem całkiem pewny this jest zawsze przedmiotem JSON.stringify obecnie iteracji ponad:

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

Piękny. Nawet [działa w wyjątkowym przypadku] (http://jsbin.com/zeciqiwawo/1), w którym szumujesz fragment dokumentu ('JSON.stringify (new Date())'), a nie cały dokument, dziękuję [kroki 9-11] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3). –

+0

naprawdę fajny .. –

3

Od MDN:

Obiekt, w którym klucz został znaleziony jest jako this parametru substytutu za.

Więc można to zrobić:

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

Dzięki. Wiedziałem, że musi być lepszy sposób. :-) –