Konvertieren Sie Newtonsoft JObject in System.Text.Json JsonObjectC#

Ein Treffpunkt für C#-Programmierer
Guest
 Konvertieren Sie Newtonsoft JObject in System.Text.Json JsonObject

Post 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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post