webservice net asp array c# asp.net ajax json

array - web service asp net c# json



Deserializando las fechas AJAX JSON del lado del cliente (7)

Bertrand LeRoy, que trabajó en ASP.NET Atlas / AJAX, describió el diseño de la salida DateSime de JavaScriptSerializer y reveló el origen de las misteriosas barras diagonales iniciales y posteriores. Él hizo esta recomendación:

ejecuta una búsqueda simple de "/ / Date ((/ d +)) / /" y reemplaza con "new Date ($ 1)" antes de la evaluación (pero después de la validación)

Implementé eso como:

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

Esto está muy cerca de muchas de las otras respuestas:

  • Use un RegEx anclado como lo hizo Sjoerd Visscher, no olvide el ^ y $.
  • Evite string.replace, y las opciones ''g'' o ''i'' en su RegEx. "/ Fecha (1271389496563) // Fecha (1271389496563) /" no debería funcionar en absoluto.

Dada la siguiente representación de fecha JSON:

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

¿Cómo deserializar esto en su forma de fecha de JavaScript?

Intenté usar MS AJAX JavaScrioptSerializer como se muestra a continuación:

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

Sin embargo, todo lo que recupero es la fecha literal de la cadena.


El gran número es el tiempo estándar JS

new Date(1221644506800)

Mié 17 sep 2008 19:41:46 GMT + 1000 (EST)


En realidad, momentjs admite este tipo de formato, puede hacer algo como:

var momentValue = moment(value); momentValue.toDate();

Esto devuelve el valor en un formato de fecha de javascript


La expresión regular utilizada en el método ASP.net AJAX deserialize busca una cadena que se parece a "/ Date (1234) /" (la cadena en sí necesita contener las comillas y las barras inclinadas). Para obtener una cadena de este tipo, deberá escapar de los caracteres de comillas y barras diagonales, por lo que el código de JavaScript para crear la cadena se ve como "/" / / Fecha (1234) / / / "".

Esto funcionará

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

Es un poco extraño, pero descubrí que tenía que serializar una fecha, luego serializar la cadena devuelta a partir de eso, luego deserializar en el lado del cliente una vez.

Algo como esto.

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


Para aquellos que no quieren usar Microsoft Ajax, simplemente agreguen una función de prototipo a la clase de cadena.

P.ej

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

¿No quieres usar eval? Pruebe algo simple como

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

Como nota al margen, solía pensar que Microsoft era engañoso al usar este formato. Sin embargo, la especificación JSON no es muy clara cuando se trata de definir una forma de describir las fechas en JSON.


Siempre que sepa que la cadena es definitivamente una fecha, prefiero hacer esto:

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


Un valor JSON es una cadena, número, objeto, matriz, verdadero, falso o nulo. Entonces esto es solo una cadena. No hay forma oficial de representar fechas en JSON. Esta sintaxis es de la implementación asp.net ajax. Otros usan el formato ISO 8601.

Puedes analizarlo así:

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