Question

J'ai sérialisé un objet en utilisant JSON de sérialiseur Newtonsoft et le DateTime est venu à travers comme:

/Date(1237588418563+0000)/

Quand je $ .evalJSON () à ce sujet, il est un objet, mais je ne peux pas trouver des méthodes de date normale comme toUTCString dessus.

Toutes les idées ce que je peux faire avec ça?

Était-ce utile?

La solution

Utilisez l'une des JsonConverters qui viennent avec Json.NET pour travailler avec des dates pour obtenir un meilleur format. JavaScriptDateTimeConverter vous donnera automatiquement une date 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"}    
}

Documentation: Dates Sérialisation en JSON avec Json.NET

Autres conseils

Je suis venu avec une approche différente qui pourrait être utile à certains. Fondamentalement, je crée mon propre CustomDateConverter que j'appelle quand je besoin. Le convertisseur prend 2 paramètres, un format de date par exemple Et un TimeZoneInfo yyyy-MM-dd HH:mm:ss, ce qui me permet de convertir la date de UTC en temps de l'utilisateur de la zone:

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

Vous pouvez l'utiliser comme ceci:

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

vous pouvez enlever toute évidence tout ce qui concerne le fuseau horaire si vous ne souhaitez que la mise en forme de date personnalisée. Faites-moi savoir ce qui a aidé!

A partir de la version Newtonsoft Json.Net 4.5r5 vous utilisez la classe JsonPropertyAttribute catégoriels et sa ItemConverterType propriété de la propriété. Utilisation:

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

Comme je l'ai observé cela régler la DateTimeConverter pour toutes les propriétés de cette classe et pas seulement celle d'avant qui est déclarée.

rencontré le même problème, et trouvé une solution basée sur le lien d'Adam:

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

Il ressemble à un horodatage Unix, qui javascript est facilement capable de convertir en un objet date. Le est simplement - 0 faire javascript traiter la sortie comme un substr entier ... Je suppose que vous pourriez aussi bien Number(), si vous ne voulez pas les regards de <=>

L'objet JSON contenait quelque chose comme ceci:

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

mais, il serait encore préférable de fixer l'objet JSON afin que la fonction de la date a tiré sans utiliser quelque chose comme eval () ou la fenêtre []. Peut-être dans jQuery. Je ne sais pas.

Ne pas oublier que le décalage peut être et non pas seulement + pour le décalage -!

Désolé je simplifie un peu Newton-King @ James

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

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

Cela fonctionne pour moi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top