Page 1 of 1

Konvertieren Sie Newtonsoft JObject in System.Text.Json JsonObject

Posted: 21 Dec 2024, 18:16
by Guest
Ich versuche, meine Lösung von der Verwendung von Newtonsoft auf System.Text.Json zu aktualisieren. Eines der Nuget-Pakete, die ich nutzen kann, ruft REST-APIs auf, die komplexe Objekte zurückgeben, die es mit Newtonsoft deserialisiert. Ich bin nicht in der Lage, dieses Nuget-Paket zu ändern, und ich möchte lieber keinen eigenen Client schreiben, um die REST-APIs zu nutzen.
Einer der API-Endpunkte gibt komplexe Objekte zurück, Beispiel:< /p>
// ComplexResource is defined in the nuget package and is annotated with Newtonsoft
public class ComplexResource
{
[JsonProperty("uuid")]
public Guid Uuid;

[JsonProperty("child_resources")]
public Dictionary ChildResources;
}


Das ChildResources Dictionary ist wie folgt aufgebaut:
  • Der Schlüssel ist der Name des Typs (z. B. PlanResource)
  • Der Wert selbst ist ein weiterer komplexer Typ, einer von

    < li>Im Falle mehrerer Elemente ein JArray mit einigen weiteren JObject items
  • Im Falle eines einzelnen Elements ein JObject

Hier beginnt der Spaß. Ich möchte alle ChildResources-Elemente in die Darstellung jedes Elements in meiner Lösung deserialisieren (z. B.PlanResource). Das PlanResource-Objekt in meiner Lösung ist korrekt mit System.Text.Json-Attributen annotiert (z. B. JsonPropertyName).
Leider kann ich keine Möglichkeit finden Um dies zu tun, ohne die Werte des Wörterbuchs wieder in JSON zu reserialisieren, Beispiel:
// Step 0: Get value from dictionary
var complexResource = ... uses nuget package, returns ComplexResource ...
var resourceData = complexResource.ChildResources["PlanResource"];

// Step 1: Serialize back out **with Newtonsoft**
var jsonString = JsonConvert.SerializeObject(resourceData);

// Step 2: Deserialize **with System.Text.Json**
var actualResource = JsonSerializer.Deserialize(jsonString);

// Step 3: Operate on PlanResource as normal
actualResource.LastUpdated = ...

Dies scheint ineffizient zu sein und erfordert viel Serialisierung und Deserialisierung.
Gibt es eine direktere Möglichkeit, diese Objekte zu konvertieren, ohne etwas zu schreiben? Benutzerdefinierter Mapper für jeden einzelnen Ressourcentyp?