json Deserialisierung: Verwandte mehrdeutige Arrays und Objekte
Bei der Verarbeitung von JSON -Daten begegnen Sie häufig strukturelle Inkonsistenz. Einige Eigenschaften können in einer Instanz und als Objekte in einem anderen als Arrays dargestellt werden. Dies kann während der Deserialisierung zu Problemen führen, insbesondere bei der Verwendung von Typen-Sicherheit-Klassen.
Frage:
Betrachten Sie die folgenden JSON -Daten, die von Facebook zurückgegeben wurden:
wall posts (Objekt):
]] {
"description": "",
"permalink": "..."
}
foto posts (array):
{
"media": [
{
"href": "...",
"src": "..."
}
]
}
Mobile Wandposts (Objekt):
{
"name": null,
"caption": null,
"media": {}
}
Im Fall von Wall -Posts wird das Attribut "Medien" als leeres Objekt anstelle eines Arrays dargestellt. Dieser Unterschied bewirkt, dass die Deserialisierung fehlschlägt, wenn eine Klasse verwendet wird, die ein Array von "FacebookMedia" -Objekten erwartet.
Lösung: benutzerdefinierte JSON Converter
Um diese Situation zu bewältigen, können wir einen benutzerdefinierten JSON -Konverter erstellen. Dieser Konverter überprüft die JSON -Struktur und gibt eine Liste oder eine NULL basierend auf dem Vorhandensein eines Arrays oder eines Objekts zurück.
public class FacebookMediaJsonConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
return serializer.Deserialize>(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);
}
}
Verwendung:
, um den Konverter zu verwenden, verwenden Sie [jsonConverter]
Attribut -Kommentatorklasse:
[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List Media { get; set; }
Erweiterungen für einzelne Objekte:
Wenn Sie möchten, dass eine Liste empfangen wird, auch wenn nur ein Objekt, können Sie den Konverter erweitern, um ein einzelnes Objekt in eine Liste umzuwandeln.
public class SingleValuearrayConverter
public class SingleValueArrayConverter : 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 { instance };
}
else if (reader.TokenType == JsonToken.StartArray)
{
result = serializer.Deserialize(reader, objectType);
}
else
{
throw new JsonSerializationException("Unexpected token type.");
}
return result;
}
// ... 转换器实现的其余部分 ...
}
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3