Polymorphismus und Serialisierung mit System.Text.Json führen zu einem Fehler aufgrund doppelter Schlüssel in OpenAPIC#

Ein Treffpunkt für C#-Programmierer
Guest
 Polymorphismus und Serialisierung mit System.Text.Json führen zu einem Fehler aufgrund doppelter Schlüssel in OpenAPI

Post by Guest »

Ich arbeite an einem Projekt, das intern Newtonsoft.Json verwendet, um komplexe Objekte einschließlich Typinformationen zu serialisieren und zu deserialisieren. Das funktioniert wie es sollte. Wir verwenden die Minimal-API für unsere API und verwenden ASP.NET Core 9 und Swagger.
Ich verstehe, dass wir, da wir die Minimal-API verwenden, keine andere Wahl haben, als System.Text zu verwenden. Json, und dies verursacht einige Probleme mit Polymorphismus, was entweder dazu führt, dass im zurückgegebenen JSON keine Objekttypen vorhanden sind, oder dass beim Versuch, [JsonDerivedType(...)] zu verwenden, zur Laufzeit ein Fehler auftritt:

System.ArgumentException: Ein Element mit demselben Schlüssel wurde bereits hinzugefügt. Schlüssel: [Schlüsselname...]

Ich habe das Gefühl, dass dies am Grad der Vererbung liegt. Ich kann den eigentlichen Code hier nicht posten, aber das Folgende fasst das Problem zusammen, mit dem ich konfrontiert bin (Beschreibung unten): In der Lösung sind die Schnittstellen und Klassen alle separate Dateien, aber der Kürze halber habe ich sie hier in einem Block aufgelistet :

Code: Select all

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 }

Code: Select all

IObject
wird für Objekte implementiert, die gerendert werden können. Einige Objekte können jedoch untergeordnete Objekte enthalten, und diese Objekte implementieren IContainer.
Das erste, was ich versucht habe, war:

Code: Select all

[JsonDerivedType(typeof(ObjectType1), "[type discriminator here...]")]
[JsonDerivedType(typeof(ObjectType2), "[type discriminator here...]")]
[JsonDerivedType(typeof(ObjectType3), "[type discriminator here...]")]
public interface IObject {...
Dies führt dazu, dass Swagger mit einem internen Fehler 500 und der oben genannten System.ArgumentException fehlschlägt – doppelter Schlüssel. Konkret war ObjectType2 das fehlerhafte Element.
Ich habe insofern Fortschritte gemacht, als ich die Attribute [JsonDerivedType] in separate Schnittstellendefinitionen aufgeteilt habe:

Code: Select all

//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{...
(Hinweis: Ich habe ObjectType3 hier nicht eingefügt). Dies wird kompiliert und ausgeführt, Swagger wird angezeigt und der API-Endpunkt kann aufgerufen werden. Etwas JSON wird zurückgegeben, aber es enthält keine Typinformationen – darauf werde ich ein anderes Mal eingehen.
Das Problem ist, dass ich nicht herausfinden kann, wie ich einen abgeleiteten Typ für ObjectType3 hinzufügen kann – wenn ich [JsonDerivedType(nameof(ObjectType3), "...")] zu IObject.cs hinzufüge, erhalte ich wieder doppelte Schlüssel und kann Swagger nicht verwenden .
Kann jemand erklären, was? Ich mache etwas falsch, insbesondere was die Frage angeht, wie man die abgeleiteten Typen hinzufügt, ohne dass doppelte Schlüssel entstehen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post