net - json serialize date
AnĂ¡lisis JSON DateTime del serializador JSON de Newtonsoft (7)
A partir de Newtonsoft Json.Net versión 4.5r5 utiliza la clase JsonPropertyAttribute Class y establece su propiedad ItemConverterType Property. Uso:
// class to be serialized
public class MyClass
{
[JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
public DateTime? DateTime1;
public DateTime? DateTime2;
}
Como he observado, esto configurará el DateTimeConverter para todas las propiedades en esta clase, no solo la anterior a la que se declara.
He serializado un objeto usando el serializador JSON de Newtonsoft, y DateTime ha llegado como:
/Date(1237588418563+0000)/
Cuando I $ .evalJSON () en eso, es un objeto pero no puedo encontrar ningún método de fecha normal como toUTCString en él.
¿Alguna idea de lo que puedo hacer con esto?
El objeto JSON contenía algo como esto:
var data = {"CreatedDate":"/Date(1327572000000-1000)/"});
///
var oddDateTimeZone = data.CreatedDate;
var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13);
var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4);
var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone)));
pero, aún así, sería mejor arreglar el objeto JSON para que la función de fecha se disparara sin usar algo como eval () o window []. Tal vez en jQuery. No es seguro.
¡No olvide que el desplazamiento podría ser +
y no solo -
para el desplazamiento!
Lo siento, simplifico un poco @James Newton-King
string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);
ObjectMapper mapper = new ObjectMapper ();
mapper.registerModule (nuevo JavaTimeModule ());
mapper.configure (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
Esto funciona para mí
Se encontró con el mismo problema y encontró una solución basada en el enlace de Adam:
new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));
Parece una marca de tiempo Unix, que javascript puede convertir fácilmente en un objeto de fecha. The - 0
es simplemente para hacer que javascript trate el resultado del substr
como un entero ... Supongo que también podría Number()
si no le gusta el aspecto de - 0
Se me ocurrió un enfoque diferente que podría ser útil para algunos. Básicamente creo mi propio CustomDateConverter al que llamo cuando lo necesito. El convertidor toma 2 parámetros, un formato de fecha, por ejemplo, yyyy-MM-dd HH:mm:ss
y TimeZoneInfo, que me permite convertir la fecha de UTC a la zona horaria del usuario:
public class JSONCustomDateConverter : DateTimeConverterBase
{
private TimeZoneInfo _timeZoneInfo;
private string _dateFormat;
public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo)
{
_dateFormat = dateFormat;
_timeZoneInfo = timeZoneInfo;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateTime);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat));
writer.Flush();
}
Puedes usarlo así:
var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });
Obviamente, puede eliminar todo lo relacionado con la zona horaria si solo desea un formato de fecha personalizado. ¡Déjame saber que ayudó!
Utilice uno de los JsonConverters que vienen con Json.NET para trabajar con las fechas y obtener un mejor formato. JavaScriptDateTimeConverter le dará automáticamente una fecha de JavaScript.
public class LogEntry
{
public string Details { get; set; }
public DateTime LogDate { get; set; }
}
[Test]
public void WriteJsonDates()
{
LogEntry entry = new LogEntry
{
LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),
Details = "Application started."
};
string defaultJson = JsonConvert.SerializeObject(entry);
// {"Details":"Application started.","LogDate":"//Date(1234656000000)//"}
string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());
// {"Details":"Application started.","LogDate":new Date(1234656000000)}
string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());
// {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}
}
Documentación: serialización de fechas en JSON con Json.NET