在对象的 toJSON *之前*调用替换器?
Call the replacer *before* the object's toJSON?
有没有办法让我的替换器在 之前 一个对象自己的 toJSON
转换它,这样我就可以使用原始对象而不是它的 JSON-友好形式,没有覆盖对象或其原型上的toJSON
,预处理对象,或编写我自己的JSON.stringify
版本?
例如:假设我想以不同于正常序列化 (which is toISOString
) 的方式序列化 Date
个实例。 (这个问题 不是 特定于 Date
,这只是一个例子。)问题是,我的替换器没有看到 Date
对象,它看到一个字符串(见下面的片段)因为 Date.prototype.toJSON
在 我的替代者之前被称为 。
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>
有没有办法让替换器先被调用?我不想覆盖 Date.prototype.toJSON
、预处理对象或编写我自己的 JSON.stringify
,但我没有看到其他方法。
来自MDN:
The object in which the key was found is provided as the replacer's this
parameter.
所以你可以这样做:
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>
如果我理解你是正确的,这应该可以解决问题,我很确定 this
始终是对象 JSON.stringify
当前迭代的对象:
var json = JSON.stringify(obj, function(key, value) {
if (key === "d") {
snippet.log(getType(this[key]));
}
return value;
});
有没有办法让我的替换器在 之前 一个对象自己的 toJSON
转换它,这样我就可以使用原始对象而不是它的 JSON-友好形式,没有覆盖对象或其原型上的toJSON
,预处理对象,或编写我自己的JSON.stringify
版本?
例如:假设我想以不同于正常序列化 (which is toISOString
) 的方式序列化 Date
个实例。 (这个问题 不是 特定于 Date
,这只是一个例子。)问题是,我的替换器没有看到 Date
对象,它看到一个字符串(见下面的片段)因为 Date.prototype.toJSON
在 我的替代者之前被称为 。
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>
有没有办法让替换器先被调用?我不想覆盖 Date.prototype.toJSON
、预处理对象或编写我自己的 JSON.stringify
,但我没有看到其他方法。
来自MDN:
The object in which the key was found is provided as the replacer's
this
parameter.
所以你可以这样做:
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>
如果我理解你是正确的,这应该可以解决问题,我很确定 this
始终是对象 JSON.stringify
当前迭代的对象:
var json = JSON.stringify(obj, function(key, value) {
if (key === "d") {
snippet.log(getType(this[key]));
}
return value;
});