Wie kann ich ein Attribut in einer abgeleiteten Klasse "un-JsonIgnore"?

8

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).

  • Gibt es eine Möglichkeit für mich, JsonSerializer zu zwingen, dieses Attribut wieder aufzunehmen?
  • Ist es möglich, ein Attribut explizit als [JsonIgnore] , aber nur in der Basisklasse zu markieren?
PLNech 23.02.2015, 12:46
quelle

5 Antworten

7

Sie können dies tun, indem Sie eine benutzerdefinierte DefaultContractResolver erstellen und die Methode CreateProperty überschreiben.

Beispiel: Eine Foo -Basis und eine abgeleitete Bar :

%Vor%

Sie können den folgenden Vertragsresolver anlegen:

%Vor%

Dies setzt alle Eigenschaften auf Ignored = false und analysiert sie dann anhand des gegebenen Prädikats:

%Vor%

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 :

%Vor%     
Yuval Itzchakov 23.02.2015, 13:00
quelle
9

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.)

%Vor%

Geige: Ссылка

    
Brian Rogers 23.02.2015 18:24
quelle
3

Sie können ParentId in der abgeleiteten Klasse einfach überschreiben.

%Vor%     
xanatos 23.02.2015 12:52
quelle
3

Ich habe dasselbe Problem gelöst, indem ich das new-Schlüsselwort für die Eigenschaft der abgeleiteten Klasse verwendet habe.

%Vor%     
John Caprez 18.03.2016 16:31
quelle
1

Ich habe das gleiche Problem mit einer Ghost-Eigenschaft gelöst:

%Vor%

Wenn ich diese Eigenschaft immer versteckt anzeigen möchte, beziehe ich sie, manchmal ist sie null:

%Vor%     
iguypouf 12.04.2017 13:44
quelle