34 votos

El análisis de JSON DateTime de Newtonsoft del JSON Serializador

He serializa un objeto utilizando Newtonsoft del JSON serializador, y la DateTime ha llegado a través de:

/Date(1237588418563+0000)/

Cuando Me $.evalJSON() en que, es un objeto, pero no puedo encontrar ninguna Fecha normal de métodos como la toUTCString.

Alguna idea de lo que puedo hacer con esto?

78voto

James Newton-King Puntos 13880

Utilice uno de los JsonConverters que vienen con Json.NET para trabajar con fechas para obtener un mejor formato. JavaScriptDateTimeConverter automáticamente le dará una fecha 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: Registrar las Fechas en JSON con Json.NET

16voto

Johann Puntos 3011

Me ocurrió con un enfoque diferente que podría ser útil para algunos. Básicamente puedo crear mi propio CustomDateConverter que me llame cuando lo necesite. El convertidor recibe 2 parámetros, un formato de fecha por ejemplo yyyy-MM-dd HH:mm:ss y un TimeZoneInfo, que me permite convertir la fecha a partir de la 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();
    }

Se puede utilizar como esto:

 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, usted podría quitar cualquier cosa relacionada con la zona horaria si sólo desea personalizado formato de fecha. Déjame saber lo que ayudó!

15voto

Anderson Puntos 431

Como de Newtonsoft Json.Net la versión 4.5r5 utilizar el JsonPropertyAttribute Clase clase y su ItemConverterType de la Propiedad de la propiedad. Uso:

// class to be serialized
public class MyClass
{
    [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
    public DateTime? DateTime1;
    public DateTime? DateTime2;
}

Como he observado esto establecerá el DateTimeConverter para todas las propiedades de esta clase no sólo uno, antes de que sea declarada.

2voto

peirix Puntos 10728

Topó con el mismo problema y encontrar una solución basada en el vínculo de Adán:

new Date(yourDate.substr(yourDate.indexOf("("), 13) - 0));

Parece un timestamp de Unix, que javascript es fácilmente capaz de convertir en un objeto date. El - 0 es simplemente hacer que javascript tratamiento de la substr resultado como un entero... creo que se puede, Number() como bueno, si no te gusta el aspecto de la - 0

1voto

PowerSparks Puntos 1

El objeto JSON contiene 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 para arreglar el objeto JSON por lo que la función de fecha despedidos sin el uso de algo como eval() o en la ventana[]. Tal vez en jQuery. No estoy seguro.

No olvides que el desplazamiento podría ser + y no sólo - para el desplazamiento!

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: