Heim > Backend-Entwicklung > C++ > Wie deserialisiere ich JSON mit dynamischen numerischen Schlüsseln mithilfe von Newtonsoft.Json?

Wie deserialisiere ich JSON mit dynamischen numerischen Schlüsseln mithilfe von Newtonsoft.Json?

DDD
Freigeben: 2025-01-13 19:07:44
Original
693 Leute haben es durchsucht

How to Deserialize JSON with Dynamic Numeric Keys Using Newtonsoft.Json?

Wie deserialisiere ich ein Unterobjekt mit dynamischen (numerischen) Schlüsselnamen?

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.

JSON-Struktur

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>
Nach dem Login kopieren

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.

Erste Versuche und Herausforderungen

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>
Nach dem Login kopieren

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.

Benutzerdefinierter JSON-Konverter

Um dieses Problem zu lösen, ist ein benutzerdefinierter JSON-Konverter erforderlich. TypedExtensionDataConverterLöst dieses Problem elegant. Hier ist der Code:

<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter
{
    // ... [此处省略实现,篇幅原因]
}</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Durch die Verwendung von JsonTypedExtensionDataAttribute kann der Konverter unbekannte Eigenschaften in das UserTable-Wörterbuch serialisieren/deserialisieren.

Komplette Lösung

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage