Heim >Backend-Entwicklung >C++ >Wie deserialisiere ich JSON mit optionalen Arrays und Objekten in JSON.NET?
Handhabung der Deserialisierung optionaler Arrays und Objekte in JSON.NET
Wenn Sie die JSON.NET-Bibliothek zur Verarbeitung der von Facebook zurückgegebenen Daten verwenden, kann es zu Änderungen in der JSON-Struktur kommen. Einige Eigenschaften werden manchmal als Arrays und manchmal als Objekte dargestellt. Dies kann zu Deserialisierungsproblemen führen.
Frage
Einige Facebook-Beiträge geben möglicherweise JSON im folgenden Format zurück, was dazu führt, dass die Deserialisierung fehlschlägt:
<code class="language-json">"attachment": { "media":{}, "name":"", "caption":"", "description":"", "properties":{}, "icon":"http://www.facebook.com/images/icons/mobile_app.gif", "fb_object_type":"" }, "permalink":"http://www.facebook.com/1234"</code>
Lösung
Um dieses Problem zu lösen, können Sie die Klasse JsonConverter
verwenden, um einen benutzerdefinierten JSON-Konverter zu implementieren. Dieser Konverter verarbeitet Arrays und Objektstrukturen bestimmter Eigenschaften.
Benutzerdefinierter JSON-Konverter
Der folgende benutzerdefinierte Konverter SingleValueArrayConverter
konvertiert ein einzelnes Objekt in eine Liste und ermöglicht so die korrekte Deserialisierung von Eigenschaften:
<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { object retVal; if (reader.TokenType == JsonToken.StartObject) { T instance = (T)serializer.Deserialize(reader, typeof(T)); retVal = new List<T>() { instance }; } else if (reader.TokenType == JsonToken.StartArray) { retVal = serializer.Deserialize(reader, objectType); } else { retVal = null; // 处理其他情况,例如空值 } return retVal; } public override bool CanConvert(Type objectType) { return true; } }</code>
Nutzung
Um einen benutzerdefinierten Konverter zu verwenden, kommentieren Sie die Eigenschaft in der Zielklasse mit dem Attribut JsonConverter
:
<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))] public List<OrderItem> Items { get; set; }</code>
Dadurch kann JSON.NET Arrays und Objektstrukturen von Items
-Eigenschaften verarbeiten und so Deserialisierungsprobleme lösen. Beachten Sie das Hinzufügen von get; set;
und die Handhabung von else
-Fällen, um es robuster zu machen.
Das obige ist der detaillierte Inhalt vonWie deserialisiere ich JSON mit optionalen Arrays und Objekten in JSON.NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!