json.net (newtonsoft)
Ich sehe mir die Dokumentation an, finde aber nichts dazu oder den besten Weg, dies zu tun.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
Jetzt habe ich Objekte in der serialisierten Liste abgeleitet. Wie deserialisiere ich die Liste und erhalte abgeleitete Typen zurück?
c#
json
serialization
json.net
Wille
quelle
quelle
Antworten:
Wenn Sie den Typ in Ihrem speichern
text
(wie Sie es in diesem Szenario tun sollten), können Sie das verwendenJsonSerializerSettings
.Siehe: So deserialisieren Sie JSON mit Newtonsoft JSON.NET in IEnumerable <BaseType>
Sei aber vorsichtig. Wenn Sie etwas anderes verwenden, als
TypeNameHandling = TypeNameHandling.None
sich einer Sicherheitslücke öffnen könnten .quelle
TypeNameHandling = TypeNameHandling.Auto
- dies fügt eine$type
Eigenschaft NUR für Fälle hinzu, in denen der deklarierte Typ (dhBase
) nicht mit dem Instanztyp (dhDerived
) übereinstimmt . Auf diese Weise wird Ihr JSON nicht so stark aufgebläht wieTypeNameHandling.All
.Sie müssen die Behandlung von Typnamen aktivieren und diese als Einstellungsparameter an den (De-) Serializer übergeben.
Dies führt zu einer korrekten Deserialisierung abgeleiteter Klassen. Ein Nachteil dabei ist, dass alle von Ihnen verwendeten Objekte benannt werden. Als solche wird die Liste benannt, in die Sie die Objekte einfügen.
quelle
TypeNameHandling.Auto
wird es auch tun und ist schöner, weil es den Namen des Instanztyps nicht schreibt, wenn er mit dem Typ des Feldes / der Eigenschaft übereinstimmt, was bei den meisten Feldern / Eigenschaften häufig der Fall ist.Da die Frage so beliebt ist, kann es hilfreich sein, hinzuzufügen, was zu tun ist, wenn Sie den Namen der Typ-Eigenschaft und ihren Wert steuern möchten.
Der lange Weg besteht darin, benutzerdefinierte
JsonConverter
s zu schreiben , um die (De-) Serialisierung zu handhaben, indem die type-Eigenschaft manuell überprüft und festgelegt wird.Eine einfachere Möglichkeit ist die Verwendung von JsonSubTypes , das die gesamte Boilerplate über Attribute verarbeitet:
quelle
Verwenden Sie diese JsonKnownTypes , es ist sehr ähnlich zu verwenden, es fügt nur einen Diskriminator zu json hinzu:
Wenn Sie nun ein Objekt in json serialisieren, wird es
"$type"
mit"base"
und"derived"
value hinzugefügt und zum Deserialisieren verwendetBeispiel für eine serialisierte Liste:
quelle