Pergunta

eu serializado um objeto usando serializador JSON de Newtonsoft, eo DateTime veio através como:

/Date(1237588418563+0000)/

Quando eu $ .evalJSON () sobre isso, é um objeto, mas não consigo encontrar quaisquer métodos normais Data como toUTCString nele.

Todas as idéias que eu posso fazer com isso?

Foi útil?

Solução

Use um dos JsonConverters que vêm com Json.NET para trabalhar com datas para obter um formato melhor. JavaScriptDateTimeConverter lhe dará automaticamente uma data 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"}    
}

Documentação: Serializando Datas em JSON com Json.NET

Outras dicas

Eu vim com uma abordagem diferente, que pode ser útil para alguns. Basicamente eu criar meu próprio CustomDateConverter que eu chamo quando eu precisar dele. O conversor leva 2 parâmetros, um formato de data por exemplo yyyy-MM-dd HH:mm:ss e uma TimeZoneInfo, o que me permite converter a data a partir da UTC para o fuso horário do usuário:

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

Você pode usá-lo como este:

 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 você pode remover qualquer coisa relacionada ao fuso horário, se desejar apenas a formatação de datas personalizado. Deixe-me saber que ajudou!

A partir de Newtonsoft Json.Net versão 4.5r5 você usa a classe JsonPropertyAttribute classe e defina sua propriedade ItemConverterType propriedade. Uso:

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

Como tenho observado isso irá definir o DateTimeConverter para todas as propriedades desta classe não apenas aquele diante do qual é declarada.

correu para o mesmo problema, e encontrou uma solução baseada na ligação de Adão:

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

Parece um timestamp Unix, que javascript é facilmente capaz de se converter em um objeto data. O - 0 é simplesmente para fazer deleite javascript a saída substr como um inteiro ... Eu acho que você poderia Number()-lo bem, se você não gosta da aparência - 0

O objeto JSON continha algo como isto:

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

Mas, ainda assim seria melhor para corrigir o objeto JSON assim que a função de data demitido sem usar algo como eval () ou janela []. Talvez em jQuery. Não tenho certeza.

Não se esqueça que o deslocamento poderia ser + e não apenas - para o deslocamento!

Sorry I simplificar um pouco @ James Newton-King

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

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

Isso funciona para mim

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top