首页 > 解决方案 > 如何为 JSON.stringify 添加全局替换器和为 JSON.parse 添加全局 reviver?

问题描述

同时JSON.stringify允许你传递一个自定义replacerJSON.parse允许你传递一个自定义reviverRegExp这对于例如类型非常有用,因为默认情况下它不能被反序列化

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全局的?

标签: javascriptjson

解决方案


如果我正确地回答了你的问题——如果你想让所有未来的 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);
}

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


推荐阅读