Десериализовать строку JSON в объект, имеющий абстрактные типы.C#

Место общения программистов C#
Ответить
Anonymous
 Десериализовать строку JSON в объект, имеющий абстрактные типы.

Сообщение Anonymous »


Я пытаюсь десериализовать сложный вложенный 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.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»