Heim > Backend-Entwicklung > C++ > Wie kann ich gemischte JSON-Arrays und -Objekte in C# mit einem benutzerdefinierten JsonConverter deserialisieren?

Wie kann ich gemischte JSON-Arrays und -Objekte in C# mit einem benutzerdefinierten JsonConverter deserialisieren?

Mary-Kate Olsen
Freigeben: 2025-01-12 19:22:46
Original
564 Leute haben es durchsucht

How Can I Deserialize Mixed JSON Arrays and Objects in C# Using a Custom JsonConverter?

C#-Deserialisierung gemischter JSON-Arrays und -Objekte

Dieser Artikel befasst sich mit der Herausforderung der Deserialisierung von JSON-Daten aus Quellen wie Facebook, bei denen die Datenstruktur möglicherweise inkonsistent als Array oder Objekt erscheint. Die standardmäßige JSON.NET-Deserialisierung schlägt in solchen Situationen oft fehl.

Die Lösung: Ein benutzerdefinierter JsonConverter

Die Lösung besteht darin, einen benutzerdefinierten JSON.NET-Konverter zu erstellen. Dieser Konverter verarbeitet sowohl Array- als auch Objektformate und gewährleistet so eine konsistente Deserialisierung. (Eine ausführlichere Erklärung finden Sie unter „Verwenden eines benutzerdefinierten JsonConverters zum Beheben fehlerhafter JSON-Ergebnisse“.)

Implementierung des benutzerdefinierten Konverters

Der Kern der Lösung ist ein benutzerdefinierter Konverter, der eine Liste des Zieltyps zurückgibt, auch wenn der Eingabe-JSON ein einzelnes Objekt ist.

  1. Eigenschaftsattribut:

    Die Eigenschaft in Ihrer C#-Klasse, die die deserialisierten Daten enthält, muss mit dem benutzerdefinierten Konverter mit Anmerkungen versehen werden:

    <code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
    public List<OrderItem> Items;</code>
    Nach dem Login kopieren
  2. Die SingleValueArrayConverter Klasse:

    Dieser benutzerdefinierte Konverter überprüft den JSON-Token-Typ und deserialisiert entsprechend:

    <code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException(); // Not implemented for this example
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartObject)
            {
                T instance = (T)serializer.Deserialize(reader, typeof(T));
                return new List<T> { instance };
            }
            else if (reader.TokenType == JsonToken.StartArray)
            {
                return serializer.Deserialize(reader, objectType);
            }
            return null; // Handle other token types as needed
        }
    
        public override bool CanConvert(Type objectType)
        {
            return true; // Or add specific type checking here for robustness
        }
    }</code>
    Nach dem Login kopieren

Dieser Konverter stellt sicher, dass die resultierende C#-Eigenschaft immer ein List<T> enthält, unabhängig davon, ob es sich bei der JSON-Eingabe um ein einzelnes Objekt oder ein Array handelt. Beachten Sie, dass für den Produktionsgebrauch möglicherweise eine Fehlerbehandlung (z. B. für unerwartete Tokentypen) hinzugefügt werden muss. Dieser Ansatz ist besonders nützlich, wenn eine Liste eine geeignete Datenstruktur sowohl für Einzelobjekt- als auch für Array-JSON-Eingaben ist. Für Szenarien, in denen eine Liste nicht geeignet ist, können alternative Lösungen erforderlich sein.

Das obige ist der detaillierte Inhalt vonWie kann ich gemischte JSON-Arrays und -Objekte in C# mit einem benutzerdefinierten JsonConverter deserialisieren?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage