Heim >Backend-Entwicklung >C++ >Wie kann ich bei der Deserialisierung mit mehrdeutigen JSON-Arrays und -Objekten umgehen?
JSON-Deserialisierung: Umgang mit mehrdeutigen Arrays und Objekten
Bei der Verarbeitung von JSON-Daten kommt es häufig zu strukturellen Inkonsistenzen. Einige Eigenschaften können in einer Instanz als Array und in einer anderen Instanz als Objekt dargestellt werden. Dies kann insbesondere bei Verwendung typsicherer Klassen zu Problemen bei der Deserialisierung führen.
Frage:
Bedenken Sie die folgenden von Facebook zurückgegebenen JSON-Daten:
Wandpost (Objekt):
<code class="language-json"> { "description": "", "permalink": "..." }</code>
Fotobeitrag (Array):
<code class="language-json"> { "media": [ { "href": "...", "src": "..." } ] }</code>
Mobiler Pinnwandbeitrag (Objekt):
<code class="language-json"> { "name": null, "caption": null, "media": {} }</code>
Bei bewegten Wandbeiträgen wird die Eigenschaft „media“ als leeres Objekt statt als Array dargestellt. Dieser Unterschied führt dazu, dass die Deserialisierung fehlschlägt, wenn eine Klasse verwendet wird, die ein Array von „FacebookMedia“-Objekten erwartet.
Lösung: Benutzerdefinierter JSON-Konverter
Um diese Situation zu bewältigen, können wir einen benutzerdefinierten JSON-Konverter erstellen. Dieser Konverter untersucht die JSON-Struktur und gibt je nach Vorhandensein eines Arrays oder Objekts eine Liste oder Null zurück.
<code class="language-csharp">public class FacebookMediaJsonConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartArray) return serializer.Deserialize<List<FacebookMedia>>(reader); else return null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanConvert(Type objectType) { return objectType == typeof(List<FacebookMedia>); } }</code>
Verwendung:
Um einen Konverter zu verwenden, kommentieren Sie die Eigenschaften in Ihrer Klasse mit dem [JsonConverter]
-Attribut:
<code class="language-csharp">[JsonConverter(typeof(FacebookMediaJsonConverter))] public List<FacebookMedia> Media { get; set; }</code>
Die Deserialisierung verarbeitet nun erfolgreich Arrays und Objekte der Eigenschaft „Medien“.
Erweiterungen für ein einzelnes Objekt:
Wenn Sie eine Liste auch mit nur einem Objekt erhalten möchten, können Sie den Konverter erweitern, um ein einzelnes Objekt in eine Liste umzuwandeln.
<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { object result; if (reader.TokenType == JsonToken.StartObject) { T instance = (T)serializer.Deserialize(reader, typeof(T)); result = new List<T> { instance }; } else if (reader.TokenType == JsonToken.StartArray) { result = serializer.Deserialize(reader, objectType); } else { throw new JsonSerializationException("Unexpected token type."); } return result; } // ... 转换器实现的其余部分 ... }</code>
Durch die Verwendung eines benutzerdefinierten JSON-Konverters können wir Inkonsistenzen in der JSON-Struktur beheben und eine erfolgreiche Deserialisierung sicherstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich bei der Deserialisierung mit mehrdeutigen JSON-Arrays und -Objekten umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!