Ich möchte meinen json.NET-Serializer ändern, um die $ type-Eigenschaft nur den Objekten hinzuzufügen, die eine bestimmte Schnittstelle, aber keine Eigenschaft oder verschachtelte Objekte implementieren.
Mit TypeNameHandling.Auto (Standard)
%Vor%Mit TypeNameHandling.All
%Vor%Was ich will
%Vor%Ich experimentiere mit einem benutzerdefinierten ContractResolver, aber ich bekomme es nicht zum Laufen:
%Vor% Wenn Sie die Eigenschaft "$type"
für Ihr root-Objekt benötigen und damit bei verschachtelten polymorphen Objekten und Arrays OK angezeigt werden, verwenden Sie die folgende Überladung zusammen mit TypeNameHandling.Auto
: JsonConvert.SerializeObject(Object, Type, JsonSerializerSettings)
.
Von den Dokumenten :
%Vor%Geben Sie ein Geben Sie ein: System.Typ Der Typ des Werts, der serialisiert wird. Dieser Parameter wird verwendet, wenn TypeNameHandling Auto ist, um den Typnamen auszugeben, wenn der Typ des Werts nicht übereinstimmt. Die Angabe des Typs ist optional.
Das heißt:
%Vor% Wenn Sie "$type"
für das Stammobjekt benötigen und nicht es für verschachtelte polymorphe Objekte und Arrays akzeptieren, auch wenn dies anderweitig erforderlich ist, müssen Sie TypeNameHandling.All
zusammen mit einem benutzerdefinierter Contract Resolver , der JsonContainerContract.ItemTypeNameHandling = TypeNameHandling.None
:
Dann benutze es wie:
%Vor%Beachten Sie diese Warnung schließlich in der Newtonsoft-Dokumentation :
TypeNameHandling sollte mit Vorsicht verwendet werden, wenn Ihre Anwendung JSON von einer externen Quelle deserialisiert. Eingehende Typen sollten beim Deserialisieren mit einem anderen Wert als None mit einem benutzerdefinierten SerializationBinder validiert werden.
Eine Erläuterung, warum dies erforderlich sein könnte, finden Sie unter Vorsicht vor Typnamen in Newtonsoft Json , Konfigurieren von Json.NET zum Erstellen eine anfällige Web-API , und Alvaro Muñoz & amp; Oleksandr Miroshs Blackhat-Papier Ссылка
Tags und Links json.net