Entwickler-Ecke
Sonstiges (.NET) - Newtonsoft Libary: Override DateTime serialization
braincom654 - Di 04.02.14 13:43
Titel: Newtonsoft Libary: Override DateTime serialization
Ich benutze die Netwonsoft Libary:
http://james.newtonking.com/json. Damit parse ich das reine JSON, in JSON - Objekte. Doch nun tauchte folgendes Problem auf:
Ich bekomme ein JSON, welches ein unixtimestamp (
http://www.unixtimestamp.com/index.php ) enthält, so wie dieses Beispiel:
Cascading Style Sheet
1:
| Date: "/Date(1382400000)/" |
Das Problem ist nun, in reinen JSON sieht es ja noch so aus. Doch sobald ich es mithilfe der Libary parse, probiert der das Datum schon selbst zu convertieren. Dabei kommt ein DateTime auch raus, aber leider mit einen total falschen Datum / Zeit. Hier mein Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| private JEnumerable<JObject> GetJsonObject(string json) { return GetChildren(JObject.Parse(json)) .First(c => c.Type == JTokenType.Property) .Children<JObject>(); }
public IEnumerable<JToken> GetChildren(JToken json) { foreach (var c in json.Children()) { yield return c; foreach (var cc in GetChildren(c)) yield return cc; } } |
Meine Frage is nun:
Wie schaffe ich es nun das es richtig convertiert wird? Weiß jemand wie und ob ich dort eine Methode überschreiben kann?
Denn das ist das einzige Problem, anonsten läuft alles sehr gut.
Das heißt er soll genau das selbe machen wie bisher, NUR soll er es richtig convertieren oder gar nicht. Dann kann ich das zu einen späteren Zeitpunkt noch convertieren. Bevorzugt wird natürlich die erste Variante.
Ralf Jansen - Di 04.02.14 13:55
Wenn du gezielt nur das Verhalten einer Property ändern möchtest sehe ich nur den Weg das auch gezielt in ein vordefinierte Klasse zu deserialisieren. Dort kannst du dann für diese Property einen JsonConverter definieren der anstatt der eingebauten Konvertierung benutzt wird. In der untypisierten Methodik sehe ich nicht wie das vernünftig funktionieren sollte. Da kannst du das maximal für alle ändern aber nicht gezielt für eine Property.
Edit: unsinnigen Teil entfernt. Konnte mental gerade xml und json nicht unterscheiden.
braincom654 - Di 04.02.14 15:49
Das ist aber schwer machbar in meinem Fall. Denn ich habe keine vordefinierte Klasse und kann auch keine wirklich erzeugen. Denn ich weiß nur zur Laufzeit welche Struktur der JSON - String mit sich gibt.
Bin dabei gerade die Dokumentation (
http://james.newtonking.com/json/help/index.html?topic=html/DatesInJSON.htm ) zu lesen, doch finde dort keine hilfreichen Antworten oder Code snippets für meinen speziellen Fall.
Ralf Jansen - Di 04.02.14 15:56
Ich habe deine speziellen fall auch nicht verstanden. Json.Net kann richtig mit Date umgehen. Wenn es bei einer speziellen Property nicht geht macht es keinen Sinn einen Converter zu schreiben der jedes Date anders behandeln würde. Weil der ja dann in allen Fällen wo das Date richtig übertragen wird vorraussichtlich falschen Output liefert. Du solltest erstmal rausfinden warum der Wert so im json drinsteht und warum der falsch ist bzw. warum der etwas anderes liefert als du erwartest. Vielleicht sind ja nur deine Erwartungen falsch.
braincom654 - Di 04.02.14 16:31
Die Dokumentation hat weitergeholfen, aber mich nicht auf die Lösung gebracht. Nach betrachtung vom source code habe ich nun um einiges besser verstanden was da abläuft und wie ich den Code ändern kann, dass er dasselbe noch ausführt und das DateTime parsing so anpassen wie in der Dokumentation.
Habe es jetzt so das DateTime nicht geparsed wird und mache das selbst nachher, hier mein Code snippet von vorher verändert (ungefähr, funktionstauglich muss aber noch angepasst werden :)):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private JEnumerable<JObject> GetJsonObjecta(string json) { JsonReader reader = new JsonTextReader(new StringReader(json)); reader.DateParseHandling = DateParseHandling.None; var jObject = JObject.Load(reader);
return GetChildren(jObject) .First(c => c.Type == JTokenType.Array) .Children<JObject>(); } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!