JsonConvert.DeserializeObject (Zeichenfolge) gibt den Nullwert für die $ id-Eigenschaft zurück

8

Ich lade den JSON mit System.Net.WebClient.DownloadString herunter. Ich bekomme eine gültige Antwort:

%Vor%

Und hier ist mein Modell:

%Vor%

Alles funktioniert, wenn ich das tue:

%Vor%

, außer dass die ID ($ id) -Eigenschaft immer null ist. Zuerst versuchte ich herauszufinden, ob das Dollarzeichen, das ich vom Server bekommen hatte, anders war, aber das scheint nicht der Fall zu sein. Ich bin mir nicht sicher, wohin ich von hier gehe, also irgendwelche Ideen?

Vielen Dank im Voraus.

HINWEIS: Wenn ich versuche, mit etwas wie JavaScriptSerializer zu deserialisieren, funktioniert es perfekt, also bin ich ziemlich sicher, dass etwas mit meinem Modell oder mit JSON.net nicht stimmt. Könnte aber falsch sein.

    
itslittlejohn 19.12.2013, 16:06
quelle

3 Antworten

11

Json.Net verwendet normalerweise $id zusammen mit $ref als Metadaten, um Objektreferenzen in JSON zu erhalten. Wenn also $id angezeigt wird, wird davon ausgegangen, dass die Eigenschaft nicht Teil der tatsächlichen JSON-Eigenschaft ist, sondern eine interne Kennung. Daher wird die Eigenschaft Id für Ihr Objekt nicht aufgefüllt, obwohl Sie ein [JsonProperty] -Attribut eingefügt haben, das angibt, dass dies der Fall sein sollte.

AKTUALISIEREN

Ab der Json.Net-Version 6.0.4 gibt es eine neue Einstellung mit dem Sie den Deserializer anweisen können, diese "Metadaten" -Eigenschaften als normale Eigenschaften zu behandeln, anstatt sie zu verbrauchen. Sie müssen lediglich die MetadataPropertyHandling -Einstellung auf Ignore setzen und dann wie üblich deserialisieren.

%Vor%

Vor Version 6.0.4 war eine Problemumgehung erforderlich, um dieses Problem zu beheben. Der Rest dieser Antwort behandelt die möglichen Problemumgehungen. Wenn Sie 6.0.4 oder höher verwenden, benötigen Sie die Problemumgehung nicht und können jetzt nicht mehr lesen.

Die einfachste Problemumgehung, die ich sehen kann, besteht darin, die Zeichenfolge "$id" mit "id" (einschließlich der Anführungszeichen) vor der Deserialisierung in JSON zu ersetzen, wie von @Carlos Coelho vorgeschlagen. Da Sie dies mit jeder Antwort tun müssten, würde ich Ihnen empfehlen, eine einfache Hilfsmethode zu verwenden, um Code-Duplikation zu vermeiden, z. B .:

%Vor%

Da Sie jedoch in Ihren Kommentaren gesagt haben, dass Sie nicht so scharf auf die Idee sind, eine Zeichenfolge zu ersetzen, habe ich nach anderen Optionen gesucht. Ich habe eine andere Alternative gefunden, die für dich funktionieren könnte - eine benutzerdefinierte JsonConverter . Die Idee hinter dem Konverter ist, dass er versuchen würde, die eingebauten Deserialisierungsmechanismen von Json.Net zu verwenden, um das Objekt (sans ID) zu erstellen und zu bevölkern, dann die $id -Eigenschaft manuell von der JSON abzurufen und sie zum Auffüllen der% co_de zu verwenden % Eigenschaft auf dem Objekt durch Reflektion.

Hier ist der Code für den Konverter:

%Vor%

Ich habe versucht, den Konverter so zu schreiben, dass er für jedes Objekt mit dem Id funktioniert - Sie müssen nur die $id -Methode entsprechend ändern, so dass sie für alle Typen, die Sie verwenden müssen, wahr zurückgibt es für zusätzlich zu CanConvert .

Um den Konverter zu verwenden, müssen Sie nur eine Instanz davon an FormDefinition wie folgt übergeben:

%Vor%

Wichtiger Hinweis: Sie könnten versucht sein, Ihre Klassen mit einem DeserializeObject<T> -Attribut zu dekorieren, anstatt den Konverter an den JsonConverter -Aufruf zu übergeben, aber tun Sie dies nicht - es wird dazu führen der Konverter in eine rekursive Schleife zu gehen, bis der Stapel überläuft. (Es gibt eine Möglichkeit, den Konverter mit dem Attribut zu arbeiten, aber Sie müssten die Methode DeserializeObject neu schreiben, um das Zielobjekt manuell zu erstellen und seine Eigenschaften zu füllen, anstatt ReadJson aufzurufen. Es ist machbar, aber ein wenig chaotischer.)

Lass mich wissen, ob das für dich funktioniert.

    
Brian Rogers 20.12.2013, 07:03
quelle
0

Das Problem ist das $ -Zeichen, daher wäre eine Abhilfe:

Entfernen Sie die $ aus der JsonProperty Annotation.

%Vor%

Ersetzen Sie in Ihrem Code das Sonderzeichen $

%Vor%

Bearbeitet als @BrianRogers schlägt

vor     
Carlos Coelho 19.12.2013 17:07
quelle
0

Diese Antwort hat das Problem $ id / $ ref für mich behoben: Json.Net fügt EF-Objekten $ id hinzu, obwohl PreserveReferencesHandling auf" None "gesetzt ist

Fügen Sie in Ihrer Implementierung von DefaultContractResolver / IContractResolver dieses hinzu;

%Vor%

EDIT: Dies wird die $ ID entfernen.

    
Howie 09.02.2014 10:57
quelle

Tags und Links