с учетом этого JSON:
[
{
"$id": "1",
"$type": "MyAssembly.ClassA, MyAssembly",
"Email": "me@here.com",
},
{
"$id": "2",
"$type": "MyAssembly.ClassB, MyAssembly",
"Email": "me@here.com",
}
]
и этих классов:
public abstract class BaseClass
{
public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}
Как я могу десериализовать JSON в:
IEnumerable<BaseClass> deserialized;
Я не могу использовать JsonConvert.Deserialize < IEnumerable
, потому что он жалуется, что BaseClass
является абстрактным.
Когда мне был нужен только односторонний сериализатор для определенного базового класса (для создания свойств производных классов возврата API), я придумал текущее решение
public class CustomConverter : JsonConverter<BaseClass>
{
private readonly JsonSerializerOptions _serializerOptions;
public CustomConverter()
{
_serializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
IgnoreNullValues = true,
};
}
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(BaseClass));
}
public override BaseClass Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
public override void Write(Utf8JsonWriter writer, BaseClass value, JsonSerializerOptions options)
{
writer.WriteStringValue(JsonSerializer.SerializeToUtf8Bytes(value, value.GetType(), _serializerOptions));
}
}