Pregunta

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 en él.

Alguna idea de lo que puedo hacer con esto?

¿Fue útil?

Solución

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: Fechas Serialización en JSON con Json.NET

Otros consejos

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, por ejemplo, un formato de fecha 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ó!

A partir de la versión 4.5r5 Newtonsoft Json.Net utiliza la clase JsonPropertyAttribute clase y establezca su propiedad ItemConverterType propiedad. Uso:

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

Como he observado que esto se transformará la DateTimeConverter para todas las propiedades de esta clase no sólo el anterior que se declara.

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

new Date(yourDate.substr(yourDate.indexOf("(") + 1, 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 tratar el substr de salida como un entero...Supongo que se podría Number() es así, si no te gusta el aspecto de - 0

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 puede ser + y no sólo - para el desplazamiento!

Lo sentimos simplifico un @ James Newton-Rey bits

string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);    
ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

Esto funciona para mí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top