Gestion de la désérialisation des tableaux et objets facultatifs dans JSON.NET
Lorsque vous utilisez la bibliothèque JSON.NET pour traiter les données renvoyées par Facebook, vous pouvez rencontrer des changements dans la structure JSON. Certaines propriétés sont parfois représentées sous forme de tableaux et parfois sous forme d'objets. Cela peut entraîner des problèmes de désérialisation.
Question
Certaines publications Facebook peuvent renvoyer du JSON dans le format suivant, ce qui entraîne l'échec de la désérialisation :
<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>
Solution
Pour résoudre ce problème, vous pouvez utiliser la classe JsonConverter
pour implémenter un convertisseur JSON personnalisé. Ce convertisseur gérera les tableaux et les structures d'objets de propriétés spécifiques.
Convertisseur JSON personnalisé
Le convertisseur personnalisé suivant SingleValueArrayConverter
convertit un seul objet en liste, permettant aux propriétés d'être désérialisées correctement :
<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>
Utilisation
Pour utiliser un convertisseur personnalisé, annotez la propriété dans la classe cible avec l'attribut JsonConverter
:
<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))] public List<OrderItem> Items { get; set; }</code>
Cela permettra à JSON.NET de gérer les tableaux et les structures d'objets de Items
propriétés, résolvant ainsi les problèmes de désérialisation. A noter l'ajout de get; set;
et la manipulation des cas else
pour le rendre plus robuste.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!