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.

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top