Analysieren von JSON DateTime aus dem JSON-Serializer von Newtonsoft

Ich habe ein Objekt mithilfe des JSON-Serialisierers von Newtonsoft serialisiert, und die DateTime-function wurde folgendermaßen ausgeführt:

/Date(1237588418563+0000)/ 

Wenn ich $ .evalJSON () darauf, ist es ein Objekt, aber ich kann keine normalen Date-Methoden wie toUTCSTing darauf finden.

Irgendwelche Ideen was ich damit machen kann?

Verwenden Sie einen der JsonConverter, die mit Json.NET geliefert werden, um mit Daten zu arbeiten, um ein besseres Format zu erhalten. JavaScriptDateTimeConverter gibt Ihnen automatisch ein JavaScript-Datum.

 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"} } 

Dokumentation: Serialisierung von Daten in JSON mit Json.NET

Ich habe einen anderen Ansatz entwickelt, der für einige nützlich sein könnte. Grundsätzlich erstelle ich meinen eigenen CustomDateConverter , den ich anrufe , wenn ich ihn brauche. Der Konverter benötigt 2 Parameter, ein Datumsformat zB yyyy-MM-dd HH:mm:ss und eine TimeZoneInfo, mit der ich das Datum von UTC in die Zeitzone des Benutzers umwandeln kann:

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

Du kannst es so benutzen:

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

Offensichtlich können Sie alles entfernen, was mit der Zeitzone zusammenhängt, wenn Sie nur eine benutzerdefinierte Datumsformatierung wünschen. Lass mich wissen, dass es geholfen hat!

Ab Newtonsoft Json.Net Version 4.5r5 verwenden Sie die JsonPropertyAttribute Class-class und legen ihre ItemConverterType-Property-Eigenschaft fest. Verwendung:

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

Wie ich gesehen habe, wird dies den DateTimeConverter für alle Eigenschaften in dieser class festlegen, nicht nur für die, vor der deklariert wird.

Ran in das gleiche Problem und fand eine Lösung basierend auf dem Link von Adam:

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

Es sieht wie ein Unix-Zeitstempel aus, den JavaScript einfach in ein Datumsobjekt umwandeln kann. Die - 0 ist einfach, um Javascript die substr Ausgabe als eine Ganzzahl behandeln … Ich denke, Sie könnten Number() es auch, wenn Sie nicht das Aussehen von - 0 mögen

Das JSON-Objekt enthielt etwa Folgendes:

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

aber es wäre immer noch besser, das JSON-Objekt zu reparieren, damit die Datumsfunktion ausgetriggers wird, ohne etwas wie eval () oder window [] zu verwenden. Vielleicht in jQuery. Nicht sicher.

Vergiss nicht, dass der Offset + und nicht nur - für den Offset!

Entschuldigung, ich vereinfach ein bisschen @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); 

Das funktioniert für mich