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

标签 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 中使用。)

我犯了什么错误?

最佳答案

这绝对是 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 中的键,使其不再是数字。

关于javascript - 如何恢复嵌套的 JSON 日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11225350/

相关文章:

javascript - 通过数组回收 - JavaScript

json - 如何解码json数据 Go

javascript - 为什么我的嵌套函数在 javascript 中未定义

javascript - 在 IE 中使用 Dojo 1.9.1 不起作用

javascript - 在 Jquery 中查找字母数字字符串数组中的最大数字

javascript - 如何避免 Javascript/jQuery 中的硬编码、链式异步函数?

javascript - 不调用 native 函数的普通 Cordova 插件

java - 使用 java 客户端传递 json 对象调用 Rest API

html - 在 Firefox 中存在差距,但在 IE 中没有

css - Internet Explorer - CSS Shadow All Around