Beim Umgang mit komplexen JSON-Strukturen, die Unterobjekte mit dynamischen Schlüsselnamen enthalten, kann deren Deserialisierung mit Newtonsoft JSON.NET eine Herausforderung darstellen. In diesem Artikel werden Szenarien mit solchen Strukturen untersucht und eine vollständige Lösung mithilfe eines benutzerdefinierten JSON-Konverters bereitgestellt.
Betrachten Sie die folgende JSON-Struktur:
<code class="language-json">{ "users" : { "parentname":"test", "100034" : { "name" : "tom", "state" : "WA", "id" : "cedf-c56f-18a4-4b1" }, "10045" : { "name" : "steve", "state" : "NY", "id" : "ebb2-92bf-3062-7774" }, "12345" : { "name" : "mike", "state" : "MA", "id" : "fb60-b34f-6dc8-aaf7" } } }</code>
In dieser Struktur enthält das „users“-Objekt eine Mischung aus bekannten Eigenschaften („parentname“) und unbekannten Eigenschaften (wobei numerische Schlüssel untergeordnete Objekte darstellen). Das Ziel besteht darin, diese Struktur in ein C#-Objektmodell zu deserialisieren, in dem Unterobjekte als stark typisierte Klassen dargestellt werden.
Ein erster Versuch, JSON mit Standard-JSON.NET-Code zu deserialisieren, könnte wie folgt aussehen:
<code class="language-csharp">class RootObject { public string ParentName { get; set; } public Dictionary<string, User> users { get; set; } } class User { public string name { get; set; } public string state { get; set; } public string id { get; set; } }</code>
Deserialisierung zu diesem Objektmodell schlägt aufgrund unbekannter Eigenschaften im „users“-Objekt fehl. JSON.NET erwartet standardmäßig, dass Eigenschaftsnamen mit Klasseneigenschaften übereinstimmen, und da der numerische Schlüssel keiner Eigenschaft in der User-Klasse entspricht, schlägt der Deserialisierungsprozess fehl.
Um dieses Problem zu lösen, ist ein benutzerdefinierter JSON-Konverter erforderlich. TypedExtensionDataConverter
Löst dieses Problem elegant. Hier ist der Code:
<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter { // ... [此处省略实现,篇幅原因] }</code>
Dieser Konverter ermöglicht die Deserialisierung unbekannter Eigenschaften in einen typisierten Container, in diesem Fall ein Wörterbuch von Benutzerobjekten:
<code class="language-csharp">[JsonConverter(typeof(TypedExtensionDataConverter<Users>))] class Users { public Users() { this.UserTable = new Dictionary<string, User>(); } [JsonProperty("parentname")] public string ParentName { get; set; } [JsonTypedExtensionData] public Dictionary<string, User> UserTable { get; set; } }</code>
Durch die Verwendung von JsonTypedExtensionDataAttribute
kann der Konverter unbekannte Eigenschaften in das UserTable
-Wörterbuch serialisieren/deserialisieren.
Mit einem benutzerdefinierten Konverter sieht die Komplettlösung so aus:
<code class="language-csharp">class RootObject { [JsonProperty("users")] public Users Users { get; set; } } [JsonConverter(typeof(TypedExtensionDataConverter<Users>))] class Users { // ... [如上实现] } class User { // ... [不变] }</code>
Die deserialisierte JSON-Struktur füllt nun RootObject
mit den erwarteten Werten, einschließlich der im Users
-Wörterbuch innerhalb des UserTable
-Objekts gespeicherten Unterobjekte.
Das obige ist der detaillierte Inhalt vonWie deserialisiere ich JSON mit dynamischen numerischen Schlüsseln mithilfe von Newtonsoft.Json?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!