Выберите тип, который будет использоваться для десериализации в System.Text.Json.C#

Место общения программистов C#
Ответить
Anonymous
 Выберите тип, который будет использоваться для десериализации в System.Text.Json.

Сообщение Anonymous »

У меня есть приложение .NET 6, которому необходимо десериализовать некоторые данные JSON в объекты C#, используя System.Text.Json.
Однако в классах я Я пытаюсь десериализовать. У меня классический случай, когда свойство имеет тип базового класса, например:

Код: Выделить всё

public class ClassToDeserialize
{
public JobBase SomeJob { get; set; }
}

public class JobBase
{
public string JobName { get; set; }
}
который необходимо десериализовать в правильный производный тип, например:

Код: Выделить всё

public class OnDemandJob : JobBase
{
public string RequestUser { get; set; }
}

public class ScheduledJob: JobBase
{
public string Schedule { get; set; }
}
Я хотел бы написать собственный преобразователь, который проверяет данные JSON, чтобы решить, какой тип использовать для десериализации (например, в приведенном выше примере мы могли бы выяснить, действительно ли объект является экземпляром ScheduledJob путем проверки наличия в данных свойства Schedule) и последующей десериализации в этот тип.
Теперь читаем официальную документацию Я был рад обнаружить, что Microsoft подумала об этом и есть статья с примером реализации этого сценария с помощью преобразователей:
https://learn.microsoft.com/en-us/dotne ... stem-text- json-converters-how-to?pivots=dotnet-6-0#support-polymorphic-deserialization
Однако моя проблема заключается в следующем: мне преобразователь, который они реализуют в этом примере, кажется слишком сложным для что для этого нужно сделать. В частности, после выяснения правильного типа они «вручную» создают правильный производный объект, создавая экземпляр, вручную считывая данные JSON и присваивая свойства объекту одно за другим.
Похоже, что для достижения того, чего я хочу, требуется много ручной работы. Интуитивно я думаю, что можно сделать что-то вроде этого (псевдокод):

Код: Выделить всё

public JobBase Read(...)
{
if(jsonObject.HasProperty("Schedule")
{
return JsonSerializer.Deserialize(jsonString);
}
else
{
return JsonSerializer.Deserialize(jsonString);
}
}
Возможно ли что-то подобное? Или мне действительно придется вручную создавать весь объект поле за полем?

Подробнее здесь: https://stackoverflow.com/questions/708 ... -text-json
Ответить

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

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

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

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

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