web-dev-qa-db-ja.com

クライアント側の逆シリアル化AJAX JSON日付

次のJSON日付表現が与えられます。

"\/Date(1221644506800-0700)\/"

これをJavaScriptの日付タイプの形式にどのように逆シリアル化しますか?

以下に示すように、MS AJAX JavaScrioptSerializerを使用してみました:

Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")

ただし、返されるのはリテラル文字列の日付だけです。

36
Brian Chavez

文字列が間違いなく私がこれを行うことを好む日付であることを知っているならば:

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
29
Simon_Weaver

ASP.NET Atlas/AJAXに取り組んだBertrandLeRoyは、 JavaScriptSerializer DateTime出力の設計について説明しました 、不思議な先頭と末尾のスラッシュの起源を明らかにしました。彼はこの勧告をしました:

「\/Date((\ d +))\ /」の単純な検索を実行し、評価の前(ただし検証後)に「newDate($ 1)」に置き換えます。

私はそれを次のように実装しました:

var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "<br />");

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$");
function toDate(s) {
    if (!s) {
        return null;
    }
    var constructor = s.replace(toDateRe, "new Date($1)");
    if (constructor == s) {
        throw 'Invalid serialized DateTime value: "' + s + '"';
    }
    return eval(constructor);
}

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");

これは他の多くの答えに非常に近いです:

  • Sjoerd Visscherが行ったように、アンカーされた正規表現を使用します。^と$を忘れないでください。
  • String.replace、およびRegExの「g」または「i」オプションは避けてください。 "/ Date(1271389496563)// Date(1271389496563)/"はまったく機能しないはずです。
18
ESV

JSON値は、文字列、数値、オブジェクト、配列、true、false、またはnullです。つまり、これは単なる文字列です。 JSONで日付を表す公式の方法はありません。この構文は、asp.netajax実装からのものです。その他はISO8601形式を使用します。

次のように解析できます。

var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);
11
Sjoerd Visscher

ASP.net AJAX deserializeメソッドで使用される正規表現は、 "/ Date(1234)/"のような文字列を探します(文字列自体には実際には引用符とスラッシュが含まれている必要があります)。このような文字列を取得するには、引用符とバックスラッシュ文字をエスケープする必要があるため、文字列を作成するjavascriptコードは「\ "\/Date(1234)\/\"」のようになります。

これは機能します。

Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")

ちょっと変ですが、日付をシリアル化し、そこから返された文字列をシリアル化し、クライアント側で一度逆シリアル化する必要があることがわかりました。

このようなもの。

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);
6
Kyle Jones

Microsoft Ajaxを使用したくない場合は、プロトタイプ関数を文字列クラスに追加するだけです。

例えば。

    String.prototype.dateFromJSON = function () {
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};

Evalを使いたくないですか?次のような単純なものを試してください

var date = new Date(parseInt(jsonDate.substr(6)));

ちなみに、私はMicrosoftがこのフォーマットを使用することで誤解を招くと思っていました。ただし、JSONで日付を記述する方法を定義する場合、JSONの仕様はあまり明確ではありません。

3
Alex Nolasco

実際、momentjsはこの種のフォーマットをサポートしているので、次のようなことをするかもしれません。

    var momentValue = moment(value);

    momentValue.toDate();

これは、JavaScriptの日付形式で値を返します

2
tavo

大きな数字は標準のJS時間です

new Date(1221644506800)

2008年9月17日水曜日19:41:46GMT + 1000(EST)

1
Daniel