Как предотвратить автоматический выбор типа ключа JSON

Добрый день всем вам,

Я столкнулся с разочаровывающей проблемой, которая, кажется, происходит только в 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 вести себя так, как ожидалось?

Ответ 1

"Есть ли разумный способ заставить 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);