Ich verwende Newtonsofts JsonSerializer , um einige Klassen zu serialisieren.
Da ich im Serialisierungsprozess ein Feld meiner Klasse weglassen wollte, habe ich es folgendermaßen erklärt:
%Vor%Das hat funktioniert, aber ich stehe jetzt vor einem neuen Problem: In einer abgeleiteten Klasse möchte ich, dass dieses Feld erscheint (und mache das in dieser spezifischen abgeleiteten Klasse nur ).
Ich habe in der Dokumentation und im Internet nach einer Möglichkeit gesucht, diese Einstellung in untergeordneten Klassen zu überschreiben (ich denke, ich brauche etwas wie [JsonStopIgnore]
, aber ich konnte nichts schließen).
JsonSerializer
zu zwingen, dieses Attribut wieder aufzunehmen? [JsonIgnore]
, aber nur in der Basisklasse zu markieren? Sie können dies tun, indem Sie eine benutzerdefinierte DefaultContractResolver
erstellen und die Methode CreateProperty
überschreiben.
Beispiel: Eine Foo
-Basis und eine abgeleitete Bar
:
Sie können den folgenden Vertragsresolver anlegen:
%Vor% Dies setzt alle Eigenschaften auf Ignored = false
und analysiert sie dann anhand des gegebenen Prädikats:
Was in unserem Fall bedeutet "Sie sollten nur serialisieren, wenn sie nicht vom Typ Foo
sind" (da Foo das DeclaryingType
ist).
Wenn Sie die Deserialisierung durchführen möchten, übergeben Sie eine Instanz des Contract Resolvers an JsonSerializerSettings
:
Die einzige Möglichkeit, das Verhalten des Attributs [JsonIgnore]
zu "überschreiben", ist die Verwendung eines Vertragsauflösers, wie @Yuval Itzchakov in seiner Antwort schön erklärt.
Es gibt jedoch noch eine andere mögliche Lösung, die für Sie funktionieren könnte: Anstatt ein [JsonIgnore]
-Attribut zu verwenden, könnten Sie eine ShouldSerializeParentId()
-Methode in Ihren Klassen implementieren, um zu steuern, ob die ParentId
-Eigenschaft serialisiert wird. Übergeben Sie in der Basisklasse diese Methode false
; Überschreiben Sie dann die Methode in der abgeleiteten Klasse, um true
zurückzugeben. (Diese Funktion wird in Json.Net als bedingte Eigenschaftenserialisierung bezeichnet.)
Geige: Ссылка
Ich habe dasselbe Problem gelöst, indem ich das new-Schlüsselwort für die Eigenschaft der abgeleiteten Klasse verwendet habe.
%Vor%Tags und Links .net c# json json.net jsonserializer