json.net (newtonsoft)
Przeglądam dokumentację, ale nie mogę znaleźć nic na ten temat lub najlepszy sposób, aby to zrobić.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
Teraz mam obiekty pochodne na liście serializowanej. Jak deserializować listę i odzyskać typy pochodne?
c#
json
serialization
json.net
Będzie
źródło
źródło
Odpowiedzi:
Jeśli przechowujesz typ w swoim
text
(tak jak powinno być w tym scenariuszu), możesz użyć rozszerzeniaJsonSerializerSettings
.Zobacz: jak deserializować JSON do IEnumerable <BaseType> z Newtonsoft JSON.NET
Uważaj jednak. Używanie czegokolwiek innego niż
TypeNameHandling = TypeNameHandling.None
może narazić Cię na lukę w zabezpieczeniach .źródło
TypeNameHandling = TypeNameHandling.Auto
- spowoduje to dodanie$type
właściwości TYLKO dla instancji, w których zadeklarowany typ (tj.Base
) Nie pasuje do typu instancji (tjDerived
.). W ten sposób nie nadyma tak bardzo twojego JSON, jakTypeNameHandling.All
.Musisz włączyć obsługę nazw typów i przekazać to do (de) serializatora jako parametr ustawień.
Spowoduje to poprawną deserializację klas pochodnych. Wadą jest to, że nada nazwy wszystkim używanym obiektom, w związku z czym nada nazwę liście, na którą umieszczasz obiekty.
źródło
TypeNameHandling.Auto
zrobi to również i jest ładniejszy, ponieważ nie zapisuje nazwy typu instancji, gdy pasuje ona do typu pola / właściwości, co często ma miejsce w przypadku większości pól / właściwości.Ponieważ pytanie jest tak popularne, warto dodać, co zrobić, jeśli chcesz kontrolować nazwę właściwości typu i jej wartość.
Długą drogą jest napisanie niestandardowych
JsonConverter
s do obsługi (de) serializacji przez ręczne sprawdzenie i ustawienie właściwości type.Prostszym sposobem jest użycie JsonSubTypes , który obsługuje wszystkie standardowe elementy za pośrednictwem atrybutów:
źródło
Użyj tego JsonKnownTypes , jest to bardzo podobny sposób użycia, po prostu dodaj dyskryminator do json:
Teraz podczas serializacji obiektu w json będą dodawać
"$type"
z"base"
oraz"derived"
wartości i będzie użyty do deserializowaniaPrzykład listy zserializowanej:
źródło