43

因此,我有兴趣发现JSON.stringify将 RegExp 简化为空的对象文字(小提琴):

JSON.stringify(/^[0-9]+$/) // "{}"

这种行为是预期的吗?我意识到 RegExp 是一个没有要序列化的属性的对象。也就是说,日期也是对象。然而JSON.stringify()设法产生一个有意义的字符串:

JSON.stringify(new Date) // "2014-07-03T13:42:47.905Z"

我希望 JSON 能够通过使用.RegExp.prototype.toString()

4

6 回答 6

47

If somebody would be interested, there is a nice workaround. I don't think, that current behaviour is correct. For example, Date instance is not serialized to empty object like RegExp, though it is an object and also has no JSON representation.

RegExp.prototype.toJSON = RegExp.prototype.toString;


// sample
var foo = { rgx: /qux$/ig, date: new Date }

JSON.stringify(foo);
//> {"rgx":"/qux$/gi","date":"2014-03-21T23:11:33.749Z"}"
于 2014-03-21T23:08:05.033 回答
37

JSON.stringify和JSON.parse都可以通过使用和 reviver 参数进行自定义以进行自定义序列化和反序列化。replacer

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));

你只需要想出你自己的序列化格式。

于 2015-10-29T14:16:31.997 回答
29

是的,因为 JSON 中没有 RegExp 对象的规范表示。因此,它只是一个空对象。

编辑——现在是 2018 年;建议使用.toJSON()等解决方案的答案可能很好,尽管我会将该方法添加到原型中

Object.defineProperty(RegExp.prototype, "toJSON", {
  value: RegExp.prototype.toString
});

等等。这确保了函数名称不可枚举,这使得猴子补丁更加卫生。

于 2012-08-22T14:59:12.860 回答
8

以下是我解决此问题的方法:

将其序列化为字符串:

var pattern = /foobar/i;
var serialized = JSON.stringify(pattern.toString());

然后使用另一个正则表达式对其进行补水:

var fragments = serialized.match(/\/(.*?)\/([a-z]*)?$/i);
var rehydrated = new RegExp(fragments[1], fragments[2] || '');

保留模式和标志 - 希望这对某人有所帮助!

于 2015-11-11T00:52:38.183 回答
4
RegExp.prototype.toJSON = RegExp.prototype.toString;

var regexp = /^[0-9]+$/;
var foo = { rgx: regexp.source, date: new Date };
var stringified = JSON.stringify(foo);
new RegExp(JSON.parse(stringified).rgx)
于 2014-10-03T07:27:17.500 回答
4

我认为一个好的方法是这样的:

function stringifyFilter(key,value) {
    if (value instanceof RegExp) {
        return value.toString();
    }

    return value;
}

var myObj = {
    text : 'Howdy ho!',
    pattern : /[a-z]+/i
}

JSON.stringify(myObj,stringifyFilter); // output: {"text":"Howdy ho!","pattern":"/[a-z]+/i"}
于 2016-07-07T17:09:36.803 回答