如何恢复嵌套的JSON日期/时间

时间:2012-06-27 11:40:31

标签: javascript json internet-explorer

我有一个像这样的JSON字符串:(数据伪造,我的公司非常严格......)

{
    "people" : {
        "101" : {
            "name" : "Strub, Thomas Reto",
            "birthdate" : "/Date(690595200000)/"
        }
    },
    "generated" : "/Date(1340755200000)/"
}

我在解析时使用了这个reviver:

var jsonMSDateTime = new RegExp('^\\/Date\\([0-9]{13}\\)\\/$');
function jsonReviver(key, value) {
    if (jsonMSDateTime.test(value)) return new Date(value.substr(6, 13) * 1);
    else return value;
}

我的问题如下:如果我在IE中运行此脚本,则会解析生成的日期,但生日期不会被解析。 (但它适用于chrome。)

我犯了什么错误?

1 个答案:

答案 0 :(得分:2)

这绝对是IE中的一个错误(至少在IE9中)。考虑这个例子:

var js = {
    "test" : "test",
    "test2" : {
        "a" : "1"
    }, 
    "1" : { 
        "b" : "2" 
    }
};
var json = JSON.stringify(js); /* <---- all fine here */

function jsonReviver(key, value) {
    return value;
}

var jsonParsed = JSON.parse(json, jsonReviver);
jsonParsed["1"] /* <---- undefined */

问题是,如果您将密钥"1"更改为非数字密钥(例如"a1"),则可以正常工作。因此,解析器似乎不能很好地处理数字键(不知道为什么)。数值很好。

请注意,即使您使用JSON.parse(json);,结果仍然不正确。我用jQuery $.parseJSON对它进行了测试,结果不佳。

因此,您的问题至少有三种解决方案:

  1. 停止支持IE。 :)
  2. 使用JavaScript的eval("("+json+")");。毕竟JSON 是一个有效的JavaScript。我不建议,但这可能很危险。
  3. 更改JSON中的键,使它们永远不会数字化。