2015-03-03 12 views
5

Có cách nào để thay thế tôi gọi trước của một đối tượng riêng toJSON biến đổi nó, vì vậy mà tôi có thể làm việc với các đối tượng ban đầu chứ không phải là hình thức JSON-thân thiện, mà không trọng các toJSON trên đối tượng hoặc nguyên mẫu của nó , xử lý trước đối tượng hoặc viết phiên bản JSON.stringify của riêng tôi?Gọi replacer * trước * đối tượng toJSON?

Ví dụ: Giả sử tôi muốn tuần tự hóa Date trường hợp khác với phiên bản thường hóa của chúng (which is toISOString). (Câu hỏi này là không cụ thể để Date, đây chỉ là một ví dụ.) Vấn đề là, thay thế tôi không thấy đối tượng Date, nó thấy một chuỗi (xem đoạn mã dưới đây) vì Date.prototype.toJSON được gọi trước replacer của tôi .

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ó cách nào để có được những thay thế được gọi là đầu tiên? Tôi không muốn ghi đè lên Date.prototype.toJSON, xử lý trước đối tượng hoặc viết JSON.stringify của riêng tôi, nhưng tôi không thấy cách khác.

Trả lời

7

Nếu tôi hiểu bạn khắc phục điều này nên làm như lừa, tôi khá chắc chắn this luôn là đối tượng JSON.stringify hiện đang lặp lại trên:

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

Đẹp. Nó thậm chí [làm việc cho trường hợp đặc biệt] (http://jsbin.com/zeciqiwawo/1), nơi bạn đang xâu chuỗi một đoạn tài liệu ('JSON.stringify (new Date())'), không phải là toàn bộ tài liệu, nhờ đến [bước 9-11] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3). –

+0

thực sự đẹp .. –

3

Từ MDN:

Đối tượng trong đó quan trọng đã được tìm thấy được cung cấp như tham số this của replacer.

Vì vậy, bạn có thể làm điều này:

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

Cảm ơn. Tôi biết phải có một cách tốt hơn. :-) –

Các vấn đề liên quan