javascript 在对象的toJSON之前调用replacer *?

wz3gfoph  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(102)

有没有一种方法可以在对象自己的toJSON转换它之前让我的替代者调用 ,这样我就可以使用原始对象而不是它的JSON友好形式, 而无需 * 覆盖对象或其原型上的toJSON,预处理对象,或编写我自己的JSON.stringify版本?
例如:假设我希望序列化Date示例,而不是它们的正常序列化(即toISOString)。(这个问题不是特定于Date,这只是一个例子。)问题是,我的replacer没有看到Date对象,它看到的是一个字符串(见下面的片段),因为Date.prototype.toJSON在我的replacer之前被调用。

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,但我没有看到其他方法。

mqxuamgl

mqxuamgl1#

如果我理解你正确的话,这应该是有用的,我很确定this始终是JSON.stringify当前正在迭代的对象:

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

3qpi33ja2#

来自MDN:
在其中找到密钥的对象作为替换器的this参数提供。
所以你可以这样做:

var obj = {
  d: new Date()
};
console.log(getType(obj.d));     // "[object Date]"

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

function getType(value) {
  var to = typeof value;
  if (to === "object") {
    to = Object.prototype.toString.call(value);
  }
  return to;
}

相关问题