2

我有一个像这样的 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。)

我犯了什么错误?

4

1 回答 1

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 中的键,使它们永远不是数字。
于 2012-06-27T13:28:27.557 回答