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を期待どおりに動作させるための正しい方法はありますか?」

これを正気と呼ぶかどうかはわかりませんが、リバイバー関数で何らかの操作を行ってパッチを適用することができます。

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 に答える