【问题标题】:Call the replacer *before* the object's toJSON?在对象的 toJSON 之前调用替换器 *before*?
【发布时间】: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,但我没有看到其他方式。

【问题讨论】:

    标签: javascript 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' 一起使用吗?
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多