在对象的 toJSON 之前调用替换器 *before*?
Posted
技术标签:
【中文标题】在对象的 toJSON 之前调用替换器 *before*?【英文标题】:Call the replacer *before* the object's toJSON? 【发布时间】:2015-05-04 01:55:02 【问题描述】:有没有办法让我的替换器在对象自己的toJSON
转换它之前,这样我就可以使用原始对象而不是它的 JSON 友好形式, 覆盖对象或其原型上的toJSON
,预处理对象,还是编写我自己的JSON.stringify
版本?
例如:假设我想要序列化 Date
实例,而不是它们的正常序列化 (which is toISOString
)。 (这个问题不是特定于Date
,这只是一个例子。)问题是,我的替换器没有看到Date
对象,它看到了一个字符串(参见sn-p下面)因为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
,但我没有看到其他方式。
【问题讨论】:
【参考方案1】:来自MDN:
找到密钥的对象作为替换器的
this
参数提供。
所以你可以这样做:
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>
【讨论】:
谢谢。我知道必须有更好的方法。 :-)【参考方案2】:如果我理解你是正确的,这应该可以解决问题,我很确定 this
始终是 JSON.stringify
当前正在迭代的对象:
var json = JSON.stringify(obj, function(key, value)
if (key === "d")
snippet.log(getType(this[key]));
return value;
);
【讨论】:
美丽。它甚至是works for the exceptional case,您正在对文档片段(JSON.stringify(new Date())
)进行字符串化,而不是整个文档,这要感谢steps 9-11。
如果函数是静态/全局的,它将与 TypeScript 'this' 一起使用吗?以上是关于在对象的 toJSON 之前调用替换器 *before*?的主要内容,如果未能解决你的问题,请参考以下文章
fastjson 调用JSONObject.toJSON(),如果是解析泛型对象会报OutOfMemoryError错误
Apache Pig - 在脚本中多次调用 Java UDF ToJSON