.NET 8 System.Text.JSON Десериализация Json Polymorphic не работаетC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 .NET 8 System.Text.JSON Десериализация Json Polymorphic не работает

Сообщение Anonymous »

У меня возникли проблемы с полиморфной десериализацией JSON. Вот минимальный пример:
У меня есть Enum, определяющий тип JSON:

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

public enum BlockType
{
T1,
T2
}
Базовый класс и дочерний класс (и контейнер):

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

public class Container
{
required public List ListOfItems { get; set; }
}

[JsonPolymorphic(TypeDiscriminatorPropertyName = nameof(Type))]
[JsonDerivedType(typeof(Type1), nameof(BlockType.T1))]
[JsonDerivedType(typeof(Type2), nameof(BlockType.T2))]
public class BaseType
{
[JsonConverter(typeof(JsonStringEnumConverter))]
required public BlockType Type { get; set; }
}

public class Type1 : BaseType
{
required public int Value1 { get; set; }
}

public class Type2 : BaseType
{
required public int Value2 { get; set; }
}
У меня есть входной JSON:

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

var jsonBody = """
{
"ListOfItems": [
{
"type": "T1",
"Value1": 10
},
{
"type": "T2",
"Value2": 11
}
]
}
""";
И вызовем сериализатор:

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

var deserializeOptions = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
WriteIndented = true,
};
var decoded = JsonSerializer.Deserialize(jsonBody, deserializeOptions);
Сериализатор НЕ возвращает никаких ошибок. Однако, когда я проверил возвращаемый тип и список Container.ListOfItems, каждый элемент в нем является BaseType, а не производным Type1 или Type2. Фактически, если я приведу объект:

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

foreach (BaseType o in decoded.ListOfItems)
{
if (o.Type == BlockType.T1)
{
Type1 obj = (Type1)o;
}
}
Вместо этого я бы получил исключение InvalidCastException: невозможно преобразовать BaseType в Type1.
Есть ли решение этой проблемы?

Подробнее здесь: https://stackoverflow.com/questions/783 ... nt-working
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • System.Text.Json.JsonException в System.Text.Json.dll Ошибка десериализации ../Data\clients.json: значение JSON не удало
    Anonymous » » в форуме C#
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • System.Text.Json.JsonException в System.Text.Json.dll Ошибка десериализации ../Data\clients.json: не удалось преобразова
    Anonymous » » в форуме C#
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • System.Text.Json: десериализация JSON с автоматическим приведением
    Гость » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Гость
  • Десериализация в Dictionary и работа с JsonNode в System.Text.Json .NET
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Десериализация в Dictionary и работа с JsonNode в System.Text.Json .NET
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous

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