JSON.NET: Wie deserialisiere ich die Schnittstelleneigenschaft basierend auf dem Wert des übergeordneten (Inhaber-) Objekts?
Ich habe solche Klassen
class Holder {
public int ObjType { get; set; }
public List<Base> Objects { get; set; }
}
abstract class Base {
// ... doesn't matter
}
class DerivedType1 : Base {
// ... doesn't matter
}
class DerivedType2 : Base {
// ... doesn't matter
}
Mit WebAPI möchte ich das Objekt erhaltenHolder
und deserialisieren Sie es richtig. Basierend aufObjType
Wert, den ich braucheObjects
Eigentum entweder als deserialisiert werdenList<DerivedType1>
(ObjType == 1
) oderList<DerivedType2>
(ObjType == 2
).
Im Moment habe ich SO und Internet nach dem besten Ansatz durchsucht, aber das Beste, was ich gefunden habe, ist diese Antworthttps://stackoverflow.com/a/8031283/1038496. Das Problem dieser Lösung ist, dass es den Kontext des übergeordneten Objekts verliert, sodass ich den Wert von nicht herausfinden kannObjType
. OK, ich könnte das Problem lösen, indem ich eine benutzerdefinierte Version erstelleJsonConverter
zumHolder
und erinnere mich an dieObjType
Wert, aber ich habe immer noch Angst vor dieser Linie
serializer.Populate(jObject.CreateReader(), target);
wie der Kommentar unter dieser Antwort sagt
Der neue JsonReader, der mit der ReadJson-Methode erstellt wurde, erbt keine der Konfigurationswerte des ursprünglichen Readers (Culture, DateParseHandling, DateTimeZoneHandling, FloatParseHandling usw.). Diese Werte sollten kopiert werden, bevor der neue JsonReader in serializer.Populate () verwendet wird.
Was ist ein Problem für mich und das Kopieren dieser Werte durch mich selbst scheint mir nicht sauber zu sein (was ist, wenn ich etwas vermisse?)
Die Frage ist also:Gibt es einen besseren Ansatz, den ich versäumt habe, abstrakte Objekteigenschaften basierend auf dem Wert der übergeordneten Eigenschaften zu deserialisieren?