Но при сериализации для хранения в базе данных он включает дискриминатор типа в результирующий JSON, но в конце - нет в начале. Как вы знаете, это проблема при обратной десериализации, поскольку .NET требует, чтобы дискриминатор был первым полем в JSON.
Вот тип интерфейса:
Код: Выделить всё
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
[JsonDerivedType(
derivedType: typeof(DeltaRichText),
typeDiscriminator: DeltaRichText.TypeDiscriminator
)]
public interface IRichTextType;
Код: Выделить всё
public class DeltaRichText : IRichTextType
{
public const string TypeDiscriminator = "delta";
[Required]
[MinLength(1)]
[JsonPropertyName("ops")]
public List Ops { get; set; } = [];
///
/// Default constructor for DeltaRichText.
/// Initializes the Ops property with an empty DeltaOp.
///
public DeltaRichText()
{
Ops = [DeltaOp.Empty()];
}
public override string? ToString()
{
return JsonSerializer.Serialize(this);
}
// some other code...
}
Код: Выделить всё
new ValueConverter(
v => v == null ? null : v.ToString(),
v => v == null ? null : JsonSerializer.Deserialize(v, JsonSerializerOptions.Web)
);
- добавьте полиморфные атрибуты к производным типам (в данном случае DeltaRichText)
- добавьте вручную свойство Type к каждому производному типу с помощью [JsonPropertyName('$type')] и [JsonPropertyOrder(-1)]
Нет проблем при отправке клиенту, а не в базу данных. Сам не серизизирую, а возвращаю с контроллера. В Program.cs я не добавляю никаких дополнительных свойств или настроек json. В DBContext я использую JsonSerializerOptions.Web, но он не работает ни с одним из доступных параметров.
Подробнее здесь: https://stackoverflow.com/questions/798 ... et-core-10
Мобильная версия