我有一个像这样的 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 中使用。)
我犯了什么错误?
最佳答案
这绝对是 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
对其进行了测试,但效果不佳。
因此(至少)有三种解决方案可以解决您的问题:
- 停止支持 IE。 :)
- 使用 JavaScript 的
eval("("+json+")");
。毕竟 JSON 是有效的 JavaScript。不过我不建议这样做,这可能很危险。 - 更改 JSON 中的键,使其不再是数字。
关于javascript - 如何恢复嵌套的 JSON 日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11225350/