2

JSON Web サービスを使用する HTML5/JavaScript で Windows 8 Metro アプリ (別名「モダン UI スタイル」または「Windows ストア アプリ」) を構築していますが、JSON Web サービスをどの形式でシリアル化する必要があるかという問題にぶつかっています。日付型の日付を逆シリアル化する Windows 8 Metro JSON.parseメソッドの日付?

私は試した:

  • ISO-8601 形式を使用して日付を送信(JSON.parse は文字列を返します)、
  • ここで説明されているように、「/Date(1198908717056)/」などの日付を送信します(同じ結果)。

独自の JSON.stringify メソッドの出力を解析しても日付型が返されない場合でも、Windows 8 の JSON.parse メソッドが日付をサポートしているとは思えません。

例:

    var d = new Date(); // => a new date
    var str = JSON.stringify(d); // str is a string => "\"2012-07-10T14:44:00.000Z\""
    var date2 = JSON.parse(str); // date2 is a string => "2012-07-10T14:44:00.000Z"
4

2 に答える 2

4

一般的な方法でこれを機能させる方法を次に示します (ただし、Windows 8 の JSON.parse メソッドですぐにサポートされる形式を見つけたいと思います)。

サーバー上で、次を使用して文字列をシリアル化しています。

date1.ToString("s");

これは ISO 8601 日付形式を使用します。これは、使用されているカルチャや提供されている形式プロバイダーに関係なく、常に同じです (詳細については、こちらを参照してください)。

クライアント側では、正規表現を使用して日付を検索し、日付オブジェクトに自動的に変換する JSON.parse への「リバイバー」コールバックを指定しました。

最終的に、逆シリアル化されたオブジェクトには、文字列ではなく、実際の JavaScript の日付型が含まれます。

コードサンプルは次のとおりです。

    var responseResult = JSON.parse(request.responseText, function dateReviver(key, value) {
if (typeof value === 'string') {
    var re = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)$/
    var result = re.exec(value);
    if (result) {
        return new Date(Date.UTC(+result[1], +result[2] - 1, +result[3], +result[4],+result[5], +result[6]));
    }
});

これが役に立てば幸いです、カール

于 2012-09-10T15:40:22.507 に答える
2

これは、Windows 8 に固有のものではなく、 ECMA 標準 JSON パーサーJSON.parseの設計上の動作です。したがって、日付の「すぐに使えるサポート」はありません (また、そうなる可能性もあります)。

仕様ごとに、JSON 値は String、Number、Boolean、Array、Object、またはnull. 日付はサポートされていません。 (IMO、これは仕様の見落としですが、それは私たちが生きなければならないものです。)

日付型がないため、アプリは独自に日付を処理する方法を考え出さなければなりません。これを処理する最善の方法は、日付を ISO 8601 文字列 (yyyy-MM-dd'T'HH:mm:ss'Z') またはエポックからのミリ秒 (1970 年 1 月 1 日 00:00:00 UTC) として送信することです。ここで重要なのは、時刻が UTC であることを確認することです。

パフォーマンスが重要な場合は、リバイバー コールバックを使用しませんJSON.parse私は多くのテストを行いましたが、オブジェクト内のすべてのプロパティに対して関数を呼び出すことに伴うオーバーヘッドにより、パフォーマンスが半分に低下しました。

一方、すべての文字列値に対して正規表現をテストすることが、既知のプロパティ名のみを解析することに対してどれほどうまく機能するかに正直に驚きました。ループの外側で正規表現を 1 回定義するようにしてください。

明らかに、JSON 値を日付に変換する最も速い方法は、日付を解析する必要があるプロパティを正確に知っている場合です。ただし、正規表現ベースの検索方法の驚くほど優れたパフォーマンスを考えると、追加のパフォーマンスが本当に必要でない限り、追加の複雑さに値するものではないと思います。

エポック以降の ISO 文字列とミリ秒の使用に関する注意: 個別にテストされ、ミリ秒が優先されます。IE では違いはありませんが、Firefox は実際には ISO 文字列に苦労しているようです。Dateまた、コンストラクターはすべてのブラウザーで数ミリ秒かかることに注意してください。ISO 文字列も使用できますが、IE ≤ 8 では使用できません。

于 2012-09-10T18:20:52.427 に答える