2

私はこのような JSON 文字列を持っています: (データは偽造されています、私の会社は非常に制限的です...)

{
    "people" : {
        "101" : {
            "name" : "Strub, Thomas Reto",
            "birthdate" : "/Date(690595200000)/"
        }
    },
    "generated" : "/Date(1340755200000)/"
}

解析時にこのリバイバーを使用します。

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 で実行すると、生成された日付は解析されますが、生年月日は解析されません。(ただし、クロムでは動作します。)

私はどんな間違いをしましたか?

4

1 に答える 1

2

これは明らかに 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、うまくいきません。

したがって、問題には(少なくとも)3つの解決策があります。

  1. IE のサポートを停止します。:)
  2. JavaScript のeval("("+json+")");. 結局、JSON有効な JavaScript です。アドバイスはしませんが、これは危険かもしれません。
  3. JSON のキーを数値にならないように変更します。
于 2012-06-27T13:28:27.557 に答える