2008-09-17 17 views
35

In Anbetracht der folgenden JSON Datum Darstellung:Deserialisieren clientseitigen AJAX JSON Termine

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

Wie Deserialisieren Sie diese in sie JavaScript Date-type Form ist?

Ich habe versucht, MS AJAX JavaScrioptSerializer wie unten gezeigt:

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

aber alles, was ich wieder ist die wörtliche Zeichenfolge Datum.

+0

Sie vielleicht jQuery? Überprüfen Sie meinen Blogbeitrag, um Daten automatisch zu konvertieren, damit Sie es nicht manuell tun müssen. http://erraticdev.blogspot.com/2010/12/converting-dates-in-json-strings-using.html –

+0

Siehe meine Kommentare unten. Der Code Ihres Blogs schlägt an Daten vor der Epoche fehl. –

Antwort

28

Vorausgesetzt, Sie kennen die Saite auf jeden Fall ein Datum ziehe ich es, dies zu tun:

new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10)) 
+0

Das funktionierte für mich, meine ToJson Methode serialisierte DateTimes als "\/Date (1251795081950) \" – CVertex

+2

Danke Sie. 'var date = new Datum (parseInt (jsonDate.sub (6)));' funktioniert auch. –

1

Die große Zahl ist die Standardzeit JS

new Date(1221644506800) 

Mi 17. September 2008 19.41.46 GMT + 1000 (EST)

10

A JSON Wert ist eine Zeichenfolge, die Anzahl, Objekt, array , wahr, falsch oder null. Das ist also nur eine Zeichenfolge. Es gibt keine offizielle Möglichkeit, Daten in JSON darzustellen. Diese Syntax stammt aus der asp.net Ajax-Implementierung. Andere verwenden das Format ISO 8601.

Sie können es wie folgt analysieren:

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]); 
+0

Dies funktionierte nicht für mich – CVertex

+0

Meine toJson Methode spuckte serialisierte Daten als "\/Date (1251795070160) \ /" aus, die Ihr Code nicht analysiert. Ich werde herausfinden, warum später, nur hier für andere – CVertex

+0

+1 für die Veröffentlichung, was klar ist, was ein JSON-Wert sein kann und dass Daten sind nicht einer von ihnen, sondern ein benutzerdefiniertes Format. –

5

Der reguläre Ausdruck in der ASP.net AJAX deserialize Methode für eine Zeichenfolge sieht verwendet, die tatsächlich wie "/ Date (1234) /" (Der String sieht sich muss die Anführungszeichen und Schrägstriche enthalten). Um eine solche Zeichenfolge zu erhalten, müssen Sie die Zeichen für den Anführungsstrich und den umgekehrten Schrägstrich umgehen, damit der JavaScript-Code zum Erstellen der Zeichenfolge wie folgt aussieht: "\" \/Date (1234) \/\ "".

Dies wird funktionieren. einmal

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

Es ist irgendwie komisch, aber ich fand ich ein Datum serialisiert hatte, dann die Zeichenfolge serialisiert von dem zurückgegeben, dann auf der Client-Seite deserialisieren.

So etwas wie das.

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); 
+0

Das Problem damit Methode ist, dass es nicht auf die Zeitzone schaut: Sys.Serialization.JavaScriptSerializer.deserialize ("\" \\/Datum (1221644506800 + 0200) \\/\ "") Ergebnisse dasselbe wie: Sys. Serialization.JavaScriptSerializer.deserialize ("\" \\/Datum (1221644506800 + 0300) \\/\ "") –

3

Für diejenigen, die nicht wollen, Microsoft Ajax verwenden, einfach einen Prototyp-Funktion auf den String-Klasse hinzufügen .

z.

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

Möchten Sie Eval nicht verwenden? Versuchen Sie etwas Einfaches wie

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

Als Randbemerkung, Früher dachte ich, Microsoft von diesem Format irreführend war. Die JSON-Spezifikation ist jedoch nicht sehr klar, wenn es darum geht, Daten in JSON zu beschreiben.

+2

Diese Regex funktioniert nicht für Daten vor der Epoche, die einen negativen Wert haben. Du brauchst das: '/ \/Datum \ ((-? \ D +)? \) \ // i' –

16

Bertrand LeRoy, der an ASP.NET Atlas/AJAX, described the design of the JavaScriptSerializer DateTime output arbeitete und den Ursprung der mysteriösen führenden und schleppenden Schrägstriche enthüllt.Er machte diese Empfehlung:

Lauf eine einfache Suche nach "\/Date ((\ d +)) \ /" und ersetzt mit "new Date ($ 1)" vor dem eval (aber nach der Validierung)

ich realisiert, dass als:

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 />"); 

Dies ist auf die viele der anderen Antworten ganz in der Nähe ist:

  • Verwenden Sie eine verankerte RegEx wie Sjoerd Visscher tat - vergessen Sie nicht die^und $.
  • Vermeiden Sie string.replace und die Optionen 'g' oder 'i' auf Ihrer RegEx. "/ Datum (1271389496563) // Datum (1271389496563) /" sollte überhaupt nicht funktionieren.
+1

Eine sehr gute Antwort .... Schade, ich fand es am Ende der Liste für die Frage. – GordonB

+6

Diese Regex wird nicht für Daten vor der Epoche arbeiten, die einen negativen Wert haben. Du brauchst so etwas: '/ \/Datum \ ((-? \ D +) (?: - \ d +)? \) \ // i' –

1

Eigentlich momentjs diese Art von Format unterstützt, können tun Sie so etwas wie:

var momentValue = moment(value); 

    momentValue.toDate(); 

Dies gibt den Wert in einem JavaScript-Datumsformat