Konvertieren Sie Newtonsoft JObject in System.Text.Json JsonObject
Posted: 21 Dec 2024, 18:16
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:
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?
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?