web-dev-qa-db-fra.com

Analyser JSON DateTime à partir du sérialiseur JSON de Newtonsoft

J'ai sérialisé un objet à l'aide du sérialiseur JSON de Newtonsoft, et le DateTime est apparu comme:

/Date(1237588418563+0000)/

Quand je $ .evalJSON () sur cela, c'est un objet mais je ne trouve aucune méthode Date normale comme toUTCString dessus.

Une idée de ce que je peux faire avec ça?

37
tags2k

Utilisez l'un des convertisseurs Json fournis avec Json.NET pour travailler avec des dates afin d'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: Sérialisation des dates dans JSON avec Json.NET

78

J'ai proposé une approche différente qui pourrait être utile à certains. Fondamentalement, je crée mon propre CustomDateConverter que j'appelle quand j'en ai besoin. Le convertisseur prend 2 paramètres, un format de date par ex. yyyy-MM-dd HH:mm:ss et un TimeZoneInfo, ce qui me permet de convertir la date UTC en fuseau horaire de l'utilisateur:

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

De toute évidence, vous pouvez supprimer tout ce qui concerne le fuseau horaire si vous souhaitez uniquement un formatage de date personnalisé. Faites-moi savoir que cela a aidé!

16
Johann

À partir de Newtonsoft Json.Net version 4.5r5, vous utilisez la classe JsonPropertyAttribute Class et définissez sa propriété ItemConverterType Property. Usage:

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

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

15
Anderson

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

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

Il ressemble à un horodatage Unix, que javascript est facilement capable de convertir en un objet date. Le - 0 Est simplement de faire en sorte que javascript traite la sortie substr comme un entier ... Je suppose que vous pourriez aussi le faire Number(), si vous n'aimez pas l'apparence de - 0

2
peirix

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 toujours préférable de corriger l'objet JSON pour que la fonction date se déclenche sans utiliser quelque chose comme eval () ou window []. Peut-être dans jQuery. Pas certain.

N'oubliez pas que le décalage pourrait être + et pas seulement - pour l'offset!

1
PowerSparks