I'm having trouble de-serializing JSON Polymorhpically. Here is a minimal example:
I have an Enum defining the type of JSON:
public enum BlockType { T1, T2 } The base class and the child class (and the container):
public class Container { required public List<BaseType> 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; } } I have a input JSON:
var jsonBody = """ { "ListOfItems": [ { "type": "T1", "Value1": 10 }, { "type": "T2", "Value2": 11 } ] } """; And call the serializer:
var deserializeOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, WriteIndented = true, }; var decoded = JsonSerializer.Deserialize<Container>(jsonBody, deserializeOptions); The serializer does NOT returns any errors what so ever. However, when I checked the returned type and the list, Container.ListOfItems, every items in it is the BaseType, instead of the derived Type1 or Type2. In fact, if I cast the object:
foreach (BaseType o in decoded.ListOfItems) { if (o.Type == BlockType.T1) { Type1 obj = (Type1)o; } } I would instead get an InvalidCastException: Cannot convert BaseType to Type1.
Is there a solution to this problem?