【问题标题】:How to add a global replacer for JSON.stringify and global reviver for JSON.parse?如何为 JSON.stringify 添加全局替换器和为 JSON.parse 添加全局 reviver?
【发布时间】:2021-04-28 19:03:54
【问题描述】:

JSON.stringify 允许您传递自定义 replacerJSON.parse 允许您传递自定义 reviver。这对例如非常有帮助。 RegExp 类型,因为it can't be de-/serialized by default

var o = {
  foo: "bar",
  re: /foo/gi
};

function replacer(key, value) {
  if (value instanceof RegExp)
    return ("__REGEXP " + value.toString());
  else
    return value;
}

function reviver(key, value) {
  if (value.toString().indexOf("__REGEXP ") == 0) {
    var m = value.split("__REGEXP ")[1].match(/\/(.*)\/(.*)?/);
    return new RegExp(m[1], m[2] || "");
  } else
    return value;
}

console.log(JSON.parse(JSON.stringify(o, replacer, 2), reviver));

问题

这样的replacerreviver可以全局添加吗?

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    如果我正确地回答了你的问题——如果你想让所有未来的 JSON.stringify 使用你的替换器——你可以像这样覆盖标准函数:

    JSON.stringify_original = JSON.stringify;
    JSON.stringify = function(o, r, s){
      r = function(key, value){
        if (value instanceof RegExp)
          return ("__REGEXP " + value.toString());
        else
          return value;
      }
      return JSON.stingify_original(o, r, s);
    }
    

    然后用解析器做类似的事情。 如果你把它放在其他脚本运行之前 - 全局你的替换器将被应用。

    【讨论】:

    • 我也在考虑这种方法,但希望有一个内置的解决方案。我不喜欢您当前的解决方案是您不能从调用方传递另一个replacer,因为它总是会被覆盖。不过我想添加这个功能没什么大不了的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多