Десериализовать строку JSON в объект, имеющий абстрактные типы. ⇐ C#
-
Anonymous
Десериализовать строку JSON в объект, имеющий абстрактные типы.
Я пытаюсь десериализовать сложный вложенный JSON в свой объект. Единственное, в своем объекте я использую абстрактные типы, поэтому для использования правильного производного класса у него должна быть какая-то логика.
Типы сохраняются в перечислениях.
Чтобы объяснить это, я буду довольно простым и буду вкладывать только один раз, но для моих целей это больше вложено в объекты и типы.
JSON
{ "экран":{ "type":"Компонент", "нижний колонтитул":{ "type":"Бар" }, "заголовок":{ "type":"Верх" } } } Классы публичный абстрактный класс Screen { общественный абстрактный тип ScreenType {get; } } общедоступное перечисление ScreenType { Компонент, б, с, д, е } общедоступный запечатанный класс ComponentScreen: Экран { общедоступное переопределение Типа ScreenType => ScreenType.Component; публичный заголовок? Заголовок {получить; в этом; } публичный нижний колонтитул? Нижний колонтитул {получить; в этом; } публичный логический тип? ShowStuff {получить; в этом; } } Заголовок общедоступного абстрактного класса: ITyped { общественный абстрактный Тип HeaderType {get; } } общедоступное перечисление HeaderType { Вершина, б, с, д } общедоступный запечатанный класс TopScreenHeader: заголовок { общедоступное переопределение Типа HeaderType => HeaderType.Top; общественная строка MyStuff {get; } } Невозможно просто изменить все абстрактные типы или написать преобразователи, поскольку существует несколько абстрактных типов с производными объектами, умноженными на X. JSON также неоднороден.
Мой текущий код с использованием newtonsoft
var screen = JsonConvert.DeserializeObject(jsonString, new JsonSerializerSettings { ИмяТипаОбработка = ИмяТипаОбработка.Объекты, ContractResolver = новый CamelCasePropertyNamesContractResolver() } Что не работает и выдает ошибки:
Не удалось создать экземпляр типа Screens.Screen. Тип — это интерфейс или абстрактный класс, и его экземпляр не может быть создан. Путь «экран», строка 1, позиция 10.
Я пытаюсь десериализовать сложный вложенный JSON в свой объект. Единственное, в своем объекте я использую абстрактные типы, поэтому для использования правильного производного класса у него должна быть какая-то логика.
Типы сохраняются в перечислениях.
Чтобы объяснить это, я буду довольно простым и буду вкладывать только один раз, но для моих целей это больше вложено в объекты и типы.
JSON
{ "экран":{ "type":"Компонент", "нижний колонтитул":{ "type":"Бар" }, "заголовок":{ "type":"Верх" } } } Классы публичный абстрактный класс Screen { общественный абстрактный тип ScreenType {get; } } общедоступное перечисление ScreenType { Компонент, б, с, д, е } общедоступный запечатанный класс ComponentScreen: Экран { общедоступное переопределение Типа ScreenType => ScreenType.Component; публичный заголовок? Заголовок {получить; в этом; } публичный нижний колонтитул? Нижний колонтитул {получить; в этом; } публичный логический тип? ShowStuff {получить; в этом; } } Заголовок общедоступного абстрактного класса: ITyped { общественный абстрактный Тип HeaderType {get; } } общедоступное перечисление HeaderType { Вершина, б, с, д } общедоступный запечатанный класс TopScreenHeader: заголовок { общедоступное переопределение Типа HeaderType => HeaderType.Top; общественная строка MyStuff {get; } } Невозможно просто изменить все абстрактные типы или написать преобразователи, поскольку существует несколько абстрактных типов с производными объектами, умноженными на X. JSON также неоднороден.
Мой текущий код с использованием newtonsoft
var screen = JsonConvert.DeserializeObject(jsonString, new JsonSerializerSettings { ИмяТипаОбработка = ИмяТипаОбработка.Объекты, ContractResolver = новый CamelCasePropertyNamesContractResolver() } Что не работает и выдает ошибки:
Не удалось создать экземпляр типа Screens.Screen. Тип — это интерфейс или абстрактный класс, и его экземпляр не может быть создан. Путь «экран», строка 1, позиция 10.
Мобильная версия