在*对象之前调用替换器* toJSON?

时间:2015-03-03 12:04:22

标签: javascript json stringify

有没有办法在对象自己的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,但我没有看到另一种方式。

2 个答案:

答案 0 :(得分:9)

如果我理解你这是正确的,那么应该这样做,我很确定this始终是JSON.stringify目前正在迭代的对象:

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

答案 1 :(得分:3)

来自MDN

  

找到密钥的对象作为替代者的this参数提供。

所以你可以这样做:

&#13;
&#13;
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;
}
&#13;
<!-- 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>
&#13;
&#13;
&#13;