Сериализация полиморфного json в ASP.NET Core 10C#

Место общения программистов C#
Ответить
Anonymous
 Сериализация полиморфного json в ASP.NET Core 10

Сообщение Anonymous »

Я хочу использовать полиморфный JSON для типа RichText в .NET 10, потому что планирую переход из одного формата richtext в другой, и у меня возникла проблема: когда объект автоматически сериализуется при отправке клиенту, все в порядке, дискриминатор типа присутствует и все работает.
Но при сериализации для хранения в базе данных он включает дискриминатор типа в результирующий 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...
}
Затем я добавил конвертер в DbContext:

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

new ValueConverter(
v => v == null ? null : v.ToString(),
v => v == null ? null : JsonSerializer.Deserialize(v, JsonSerializerOptions.Web)
);
Вещи, которые я пробовал, но не работают:
  • добавьте полиморфные атрибуты к производным типам (в данном случае DeltaRichText)
  • добавьте вручную свойство Type к каждому производному типу с помощью [JsonPropertyName('$type')] и [JsonPropertyOrder(-1)]
Похоже, эту проблему можно решить, создав собственный конвертер или создав Dictionary с правильным порядком вручную, а затем сериализовав его. Но это кажется слишком большим для такой проблемы и не решает ее, а создает огромный обходной путь.
Нет проблем при отправке клиенту, а не в базу данных. Сам не серизизирую, а возвращаю с контроллера. В Program.cs я не добавляю никаких дополнительных свойств или настроек json. В DBContext я использую JsonSerializerOptions.Web, но он не работает ни с одним из доступных параметров.

Подробнее здесь: https://stackoverflow.com/questions/798 ... et-core-10
Ответить

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

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

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

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

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