La deserializzazione Lato Client AJAX JSON Date
Domanda
Dato il seguente JSON Data di rappresentazione:
"\/Date(1221644506800-0700)\/"
Come si fa a deserializzare questo è JavaScript Data-tipo di modulo?
Ho provato con MS AJAX JavaScrioptSerializer come mostrato di seguito:
Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")
Tuttavia, non posso tornare indietro è il valore letterale di stringa data.
Soluzione
Se si conosce la stringa è sicuramente una data io preferisco fare questo :
new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
Altri suggerimenti
Bertrand LeRoy, che ha lavorato su ASP.NET Atlas/AJAX descritto il design del JavaScriptSerializer DateTime uscita e ha rivelato l'origine del misterioso leader e le barre finali.Ha fatto questa raccomandazione:
eseguire una semplice ricerca per "\/Data((\d+))\/" e sostituire con "new Date($1)" prima di eval (ma dopo la convalida)
Ho realizzato che:
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 />");
Questo è molto vicino a molte delle altre risposte:
- Utilizzare un ancorata RegEx come Sjoerd Visscher fatto, non dimenticare i ^ e $.
- Evitare di stringa.sostituire, e la 'g' o 'i' opzioni di RegEx."/Data(1271389496563)//Data(1271389496563)/" non dovrebbe funzionare a tutti.
Un JSON valore è una stringa, numero, oggetto, array, true, false o null.Quindi questo è solo una stringa.Non c'è modo ufficiale per rappresentare le date in JSON.Questa sintassi è la asp.net ajax attuazione.Altri usano il formato ISO 8601.
È in grado di analizzare come questo:
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]);
L'espressione regolare utilizzato in ASP.net AJAX deserializzare metodo cerca una stringa che appare come "/Data(1234)/" (La stringa stessa realtà deve contenere i preventivi e le barre).Per ottenere un tale stringa, è necessario sfuggire il preventivo e caratteri barra, in modo che il codice javascript per creare la stringa appare come "\"\/Data(1234)\/\"".
Questo sarà il lavoro.
Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")
È un po ' strano, ma ho scoperto di avere serializzare una data, quindi serializzare la stringa restituita da che, poi deserializzare sul lato client una volta.
Qualcosa di simile a questo.
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);
Per chi non desidera utilizzare Microsoft Ajax, è sufficiente aggiungere un prototipo di funzione per la classe string.
E. g.
String.prototype.dateFromJSON = function () {
return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};
Non si desidera utilizzare la funzione eval?Cerco qualcosa di semplice come
var date = new Date(parseInt(jsonDate.substr(6)));
Come nota a margine, ho usato per pensare a Microsoft è stato fuorviante, utilizzando questo formato.Tuttavia, JSON specifica non è molto chiaro quando si tratta di definire un modo per descrivere le date in JSON.
In realtà, momentjs supporta questo tipo di formato, si potrebbe fare qualcosa di simile:
var momentValue = moment(value);
momentValue.toDate();
Questo restituisce il valore in javascript in un formato di data
Il numero più grande è lo standard JS tempo
new Date(1221644506800)
Wed Sep 17 2008 19:41:46 GMT+1000 (EST)