JSON.NET serialisiert JObject, während Nulleigenschaften ignoriert werden

8

Ich habe eine JObject , die als Vorlage zum Aufrufen von RESTful-Webdiensten verwendet wird. Dieses JObject wird über einen Parser erstellt und da es als Vorlage verwendet wird, um dem Benutzer zu sagen, wie das Endpoint-Schema aussieht, musste ich eine Möglichkeit finden, alle Eigenschaften zu erhalten. Deshalb setze ich ihre Werte auf null . So sieht beispielsweise das Objekt ursprünglich aus:

%Vor%

Der Benutzer kann dann einzelne Felder nach Bedarf ausfüllen, z. B. Foo.P2 und Foo.P4.P1 :

%Vor%

was bedeutet, dass sie sich nur um diese beiden Bereiche kümmern. Nun möchte ich diese Vorlage ( JObject ) in eine JSON-Zeichenfolge serialisieren, möchte aber nur die Felder anzeigen, die ausgefüllt werden. Also habe ich das versucht:

%Vor%

Leider hat das nicht funktioniert. Ich stieß auf diese Frage und erkannte, dass ein null Wert im Objekt ein tatsächlicher JToken Typ und nicht wirklich ein null ist, was sinnvoll ist. In diesem speziellen Fall muss ich jedoch diese "unbenutzten" Felder loswerden können. Ich habe versucht, manuell über Knoten zu iterieren und sie zu entfernen, aber das hat auch nicht funktioniert. Beachten Sie, dass der einzige verwaltete Typ, den ich verwende, JObject ; Ich habe kein Modell, um das Objekt zu konvertieren oder Attribute zu definieren, da dieses "Template" zur Laufzeit aufgelöst wird. Ich habe mich nur gefragt, ob jemand auf ein Problem wie dieses gestoßen ist und irgendwelche Einsichten hat. Jede Hilfe wird sehr geschätzt!

    
PoweredByOrange 08.10.2015, 23:09
quelle

3 Antworten

11

Sie können eine rekursive Hilfsmethode wie die folgende verwenden, um die null -Werte aus Ihrer JToken -Hierarchie zu entfernen, bevor Sie sie serialisieren.

%Vor%

Demo:

%Vor%

Ausgabe:

%Vor%

Geige: Ссылка

Beachten Sie, dass Sie nach dem Entfernen aller Nullwerte ein leeres Objekt in FooArray haben, das Sie nicht möchten. (Und wenn dieses Objekt entfernt würde, hätten Sie eine leere FooArray , die Sie auch nicht wollen.) Wenn Sie die Hilfsmethode beim Entfernen aggressiver machen wollen, können Sie die IsEmpty-Funktion folgendermaßen ändern:

%Vor%

Mit dieser Änderung würde stattdessen Ihre Ausgabe wie folgt aussehen:

%Vor%

Geige: Ссылка

    
Brian Rogers 09.10.2015, 01:24
quelle
2

Brians Antwort funktioniert. Ich habe auch eine andere (und immer noch rekursive) Vorgehensweise gefunden, kurz nachdem ich die Frage gestellt habe, falls jemand anderes interessiert ist.

%Vor%     
PoweredByOrange 09.10.2015 16:02
quelle
2

Sie können verhindern, dass Null-Token erstellt werden, indem Sie JsonSerializer mit NullValueHandler auf NullValueHandler.Ignore festlegen. Dies wird als Parameter an JObject.FromObject übergeben, wie in einer Antwort auf die gleiche Frage angezeigt, mit der Sie verknüpft haben: Ссылка .

    
jrupe 02.06.2016 16:13
quelle