Autor Beitrag
braincom654
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Di 04.02.14 13:43 
Ich benutze die Netwonsoft Libary: 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 ( www.unixtimestamp.com/index.php ) enthält, so wie dieses Beispiel:
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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 (james.newtonking.com...html/DatesInJSON.htm ) zu lesen, doch finde dort keine hilfreichen Antworten oder Code snippets für meinen speziellen Fall.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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 :)):

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