Maison >développement back-end >C++ >Comment puis-je désérialiser des tableaux et des objets JSON mixtes en C# à l'aide d'un JsonConverter personnalisé ?
Désérialisation C# de tableaux et d'objets JSON mixtes
Cet article aborde le défi de la désérialisation des données JSON provenant de sources telles que Facebook, où la structure des données peut apparaître de manière incohérente sous la forme d'un tableau ou d'un objet. La désérialisation JSON.NET standard échoue souvent dans de telles situations.
La solution : un convertisseur Json personnalisé
La solution consiste à créer un convertisseur JSON.NET personnalisé. Ce convertisseur gère à la fois les formats de tableau et d'objet, garantissant une désérialisation cohérente. (Voir « Utilisation d'un JsonConverter personnalisé pour corriger les mauvais résultats JSON » pour une explication plus détaillée.)
Implémentation du convertisseur personnalisé
Le cœur de la solution est un convertisseur personnalisé qui renvoie une liste du type de cible, même si le JSON d'entrée est un objet unique.
Attribut de propriété :
La propriété de votre classe C# qui contiendra les données désérialisées doit être annotée avec le convertisseur personnalisé :
<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))] public List<OrderItem> Items;</code>
La SingleValueArrayConverter
Classe :
Ce convertisseur personnalisé vérifie le type de jeton JSON et désérialise de manière appropriée :
<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>
Ce convertisseur garantit que, que l'entrée JSON soit un objet unique ou un tableau, la propriété C# résultante contiendra toujours un List<T>
. Notez que la gestion des erreurs (par exemple, pour les types de jetons inattendus) devra peut-être être ajoutée pour une utilisation en production. Cette approche est particulièrement utile lorsqu'une liste constitue une structure de données appropriée pour les entrées JSON d'objet unique et de tableau. Des solutions alternatives peuvent être nécessaires dans les scénarios où une liste n'est pas appropriée.
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!