Полиморфизм и сериализация с помощью System.Text.Json создают повторяющуюся ошибку ключа в OpenAPIC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Полиморфизм и сериализация с помощью System.Text.Json создают повторяющуюся ошибку ключа в OpenAPI

Сообщение Anonymous »

Я работаю над проектом, который внутренне использует Newtonsoft.Json для сериализации и десериализации сложных объектов, включая информацию о типе. Это работает так, как должно. Мы используем Minimal API для нашего API, используем ASP.NET Core 9 и Swagger.
Я понимаю, что, поскольку мы используем Minimal API, у нас нет другого выбора, кроме как использовать System.Text. Json, и это вызывает некоторые проблемы с полиморфизмом, в результате чего либо отсутствуют типы объектов в возвращаемом JSON, либо при попытке использовать [JsonDerivedType(...)] возникает ошибка во время выполнения:

System.ArgumentException: элемент с таким же ключом уже добавлен. Ключ: [keyname...]

У меня такое ощущение, что это вызвано степенью наследования. Я не могу опубликовать здесь фактический код, но ниже резюмируется проблема, с которой я столкнулся (описание ниже) - в решении все интерфейсы и классы представляют собой отдельные файлы, но для краткости я перечислил их в одном блоке здесь. :

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

public interface IContainer: IObject {
List Children {get;set;}
}

public interface IObject {
int Id {get;set;} //Lots of other parameters
}

public class ObjectType1 : DisplayBaseClass, IChild { //class }

public class ObjectType2 : DisplayBaseClass, IContainer { //class }

public class ObjectType3 : SomeOtherClass, IChild, IAnotherInterface, IAndAnother { //class }

реализуется для объектов, которые можно визуализировать. Однако некоторые объекты могут содержать дочерние элементы, и эти объекты реализуют IContainer.
Первое, что я попробовал:

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

[JsonDerivedType(typeof(ObjectType1), "[type discriminator here...]")]
[JsonDerivedType(typeof(ObjectType2), "[type discriminator here...]")]
[JsonDerivedType(typeof(ObjectType3), "[type discriminator here...]")]
public interface IObject {...
Это приводит к сбою Swagger с внутренней ошибкой 500 и упомянутым выше System.ArgumentException — дублирующим ключом. В частности, объектом нарушения был ObjectType2.
Я добился прогресса, разделив атрибуты [JsonDerivedType] на отдельные определения интерфейса:

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

//in IContainer.cs
[JsonPolymorphic(UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
[JsonDerivedType(typeof(ObjectType2), "[type discriminator here...]")]
public interface IContainer {...

//In IChild.cs
[JsonDerivedType(typeof(ObjectType1), "[type discriminator here...]")]
public interface IChild{...
(Обратите внимание, я не включил сюда ObjectType3). Это скомпилируется и запустится, отобразится Swagger, и можно будет вызвать конечную точку API. Возвращается некоторый JSON, но он не содержит никакой информации о типе — об этом я расскажу в другой раз.
Проблема в том, что я не могу понять, как добавить производный тип для ObjectType3. - если я добавлю [JsonDerivedType(nameof(ObjectType3), "...")] в IObject.cs, у меня снова появятся повторяющиеся ключи, и я не смогу использовать Swagger .
Кто-нибудь может объяснить, что Я делаю неправильно, особенно в отношении того, как добавлять производные типы без создания дубликатов ключей?

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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