Maison >développement back-end >C++ >Comment gérer les tableaux incohérents dans json.net lors de la désérialisation?
aborder des structures de tableau incohérentes dans la désérialisation JSON.net
désérialiser les données JSON avec JSON.net peut présenter des défis lorsqu'une propriété apparaît de manière incohérente comme une valeur unique ou un tableau sur différents objets dans un tableau JSON. Il s'agit d'un scénario commun, en particulier lors de l'interaction avec les API qui renvoient différentes structures de données. Par exemple, une propriété "catégorie" peut parfois être une seule chaîne et d'autres fois un tableau de chaînes.
Tiration d'un jsonconverter personnalisé
La solution la plus robuste consiste à créer une personnalité JsonConverter
. Cela permet une manipulation flexible de ces incohérences. Le processus implique ces étapes:
Définition de la classe de données: Créez une classe C # pour représenter vos données. Utilisez le type List<string>
pour les propriétés qui peuvent être des valeurs uniques ou des tableaux de chaînes. Annotez cette propriété avec l'attribut [JsonConverter]
, en spécifiant votre convertisseur personnalisé.
Implémentation générique JSONConverter: Développer un générique JsonConverter
capable de gérer divers types d'objets, y compris les chaînes.
ReadJson
Méthode: Implémentez la méthode ReadJson
pour analyser les données JSON et la mapper correctement au type .NET approprié, que la propriété JSON soit une seule valeur ou un tableau.
WriteJson
Méthode (facultatif): La méthode WriteJson
est facultative. Implémentez-le si vous avez besoin de sérialiser les données à JSON, en maintenant potentiellement le format incohérent d'origine.
Exemple de code
Cet exemple présente un convertisseur personnalisé en action:
<code class="language-csharp">// Data structure class public class Item { [JsonProperty("email")] public string Email { get; set; } [JsonProperty("timestamp")] public int Timestamp { get; set; } [JsonProperty("event")] public string Event { get; set; } [JsonProperty("category")] [JsonConverter(typeof(SingleOrArrayConverter<string>))] public List<string> Categories { get; set; } = new List<string>(); // Initialize to avoid null } // Generic converter public class SingleOrArrayConverter<T> : JsonConverter { public override bool CanConvert(Type objectType) { // Check if the type is a List<T> or T return objectType == typeof(List<T>) || objectType == typeof(T); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartArray) { var list = new List<T>(); while (reader.Read() && reader.TokenType != JsonToken.EndArray) { list.Add(serializer.Deserialize<T>(reader)); } return list; } else { return serializer.Deserialize<T>(reader); } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value is List<T> list) { writer.WriteStartArray(); foreach (var item in list) { serializer.Serialize(writer, item); } writer.WriteEndArray(); } else { serializer.Serialize(writer, value); } } }</code>
Ce convertisseur personnalisé permet à JSON.net de gérer gracieusement la propriété incohérente category
, offrant un processus de désérialisation plus robuste et flexible. N'oubliez pas de gérer les valeurs nulles potentielles de manière appropriée dans votre méthode ReadJson
.
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!