json.net (newtonsoft)
Я просматриваю документацию, но не могу найти ничего об этом или о том, как это лучше всего сделать.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
Теперь у меня есть производные объекты в сериализованном списке. Как десериализовать список и вернуть производные типы?
c#
json
serialization
json.net
Будет
источник
источник
Ответы:
Если вы храните тип в своем
text
(как и должно быть в этом сценарии), вы можете использовать расширениеJsonSerializerSettings
.Смотрите: как десериализовать JSON в IEnumerable <BaseType> с помощью Newtonsoft JSON.NET
Но будьте осторожны. Использование чего-либо, кроме того,
TypeNameHandling = TypeNameHandling.None
может привести к уязвимости системы безопасности .источник
TypeNameHandling = TypeNameHandling.Auto
- это добавит$type
свойство ТОЛЬКО для экземпляров, где объявленный тип (т.е.Base
) не соответствует типу экземпляра (т.е.Derived
). Таким образом, ваш JSON не раздувается так сильно, какTypeNameHandling.All
.Вы должны включить обработку имени типа и передать это (де) сериализатору в качестве параметра настроек.
Это приведет к правильной десериализации производных классов. Недостатком этого метода является то, что он будет называть все используемые вами объекты, и поэтому он будет называть список, в который вы помещаете объекты.
источник
TypeNameHandling.Auto
будет делать это тоже, и это лучше, потому что он не записывает имя типа экземпляра, когда он соответствует типу поля / свойства, что часто имеет место для большинства полей / свойств.Поскольку вопрос очень популярен, может быть полезно добавить, что делать, если вы хотите контролировать имя свойства типа и его значение.
Долгий путь - написать custom
JsonConverter
s для обработки (де) сериализации, вручную проверив и установив свойство type.Более простой способ - использовать JsonSubTypes , который обрабатывает все шаблоны через атрибуты:
источник
Используйте этот JsonKnownTypes , это очень похожий способ использования, он просто добавляет дискриминатор в json:
Теперь , когда вы сериализовать объект JSON будет добавить
"$type"
с"base"
и"derived"
значением , и он будет использовать для десериализацииПример сериализованного списка:
источник