38 votes

Analyse de la date et de l'heure JSON à partir du sérialiseur JSON de Newtonsoft

J'ai sérialisé un objet en utilisant le sérialiseur JSON de Newtonsoft, et la DateTime est arrivée comme suit :

/Date(1237588418563+0000)/

Quand je $.evalJSON() dessus, c'est un objet mais je ne trouve pas de méthodes Date normales comme toUTCString dessus.

Des idées sur ce que je peux faire avec cela ?

0 votes

Est-ce que cela fonctionne pour vous?: tek-tips.com/viewthread.cfm?qid=1526126&page=8

79voto

James Newton-King Points 13880

Utilisez l'un des JsonConverters fournis avec Json.NET pour travailler avec les 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 en JSON avec Json.NET

4 votes

Pour référence, l'espace de noms sur IsoDateTimeConverter est Newtonsoft.Json.Converters et sur JsonConvert.SerializeObject il est Newtonsoft.Json.

16voto

Johann Points 3011

J'ai trouvé une approche différente qui pourrait être utile pour 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 exemple yyyy-MM-dd HH:mm:ss et un TimeZoneInfo, ce qui me permet de convertir la date de UTC au 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() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });

Évidemment, vous pourriez supprimer tout ce qui est lié au fuseau horaire si vous ne voulez que personnaliser le format de date. Faites-moi savoir si cela vous a aidé!

1 votes

Si quelqu'un cherche à l'étendre en s'inscrivant globalement sur Asp.Net MVC. services.AddMvc() .AddJsonOptions(jsonOption => { jsonOption.SerializerSettings.Converters.Add( new JSONCustomDateConverter("dd/mm/yyyy", TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"))); });

15voto

Anderson Points 431

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

// classe à sérialiser
public class MaClasse
{
    [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.

0 votes

Cette réponse est la plus à jour

1 votes

Je ne pense pas que je comprenne ce que cela est censé faire, ou comment cela est censé fonctionner. Dans ma classe, j'ai ceci : [JsonProperty(ItemConverterType = typeof(IsoDateTimeConverter))] public System.DateTime RecordInsertedDate { get; set; } Mais mes dates continuent d'arriver au format par défaut /Date(132456560000000)/

0 votes

NVM, j'utilisais ServiceStack qui écrasait cela. Vous devez utiliser le paramètre de configuration JsConfig.DateHandler = DateHandler.ISO8601; de ServiceStack dans votre code pour obtenir ISO8601.

3voto

peirix Points 10728

Je suis tombé sur le même problème et j'ai trouvé une solution basée sur le lien fourni par Adam :

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

On dirait un timestamp Unix, que JavaScript peut facilement convertir en objet date. Le - 0 sert simplement à faire en sorte que JavaScript traite la sortie de substr comme un entier... Vous pourriez aussi utiliser Number() si vous n'aimez pas l'apparence de - 0

1voto

PowerSparks Points 1

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 quand même préférable de corriger l'objet JSON afin que la fonction de date fonctionne sans utiliser quelque chose comme eval() ou window[]. Peut-être en jQuery. Pas sûr.

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

0 votes

Vous utilisez également une regex puis évaluez le texte de cette manière : eval("new " + data.CreateDate.replace(/\//ig,"")) semble fonctionner parfaitement

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X