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.
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>
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>
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!