11

祝大家有美好的一天,

我遇到了一个似乎只发生在 Chrome 中的令人沮丧的问题。

var response = '{"01":"January","02":"February"}',
    months = JSON.parse(response);

console.log(months['02']) // undefined in Chrome (my version is 24.0.1312.5 beta)
console.log(months[2]) // "February"

Firefox 和 Safari 似乎可以按预期处理此问题,而 Chrome 将字符串式 JSON 键转换为整数。

jQuery 的 parseJSON 方法具有相同的行为(我假设它依赖于浏览器的 JSON.parse 方法)。

我完全受制于这种特定的 API 响应格式,所以我宁愿不更改服务器的响应。有没有一种健全的方法可以强制 Chrome 按预期运行?

4

1 回答 1

4

“有没有一种理智的方法可以迫使 Chrome 表现得像预期的那样?”

不确定你是否称它为理智,但你可以在 reviver 函数中进行一些操作来修补它。

var response = '{"01":"January","02":"February"}',
    months = JSON.parse(response, 
                       function(k,v) {
                         if (this.constructor === Object && // is Object
                                               !isNaN(k) && // key is a Number
                                                  +k > 0 && //   from 1
                                                  +k < 1 && //     to 9
                                        k.charAt(0) !== '0') { // missing the '0'
                             this['0' + k] = v;    // manually assign the key
                             return;  // return undefined to prevent assignment
                         }
                         return v; // allow the assignment
                     });

console.log(months['02']);

当然,您可能需要为您的代码稍微调整一下,这样您就不会修复不需要修复的东西。

您可能还想在浏览器运行之前对其进行测试,以查看是否需要修复。

var needsJSONfix = !JSON.parse('{"01":1}')["01"];

months = JSON.parse(response, needsJSONfix ? fixFunc : null);
于 2012-11-10T21:32:48.873 回答