Lors du traitement des données JSON, vous rencontrez souvent des résultats mitigés contenant des champs connus et inconnus. Cela peut poser des problèmes lors de la désérialisation des données dans une classe avec un ensemble fixe de propriétés.
Question : Étant donné un résultat JSON contenant des champs connus et inconnus, comment puis-je le désérialiser en une classe contenant des propriétés pour les champs connus et capable de gérer les champs inconnus ?
Solutions possibles :
Utilisation d'un analyseur de contrat personnalisé pour JSON.NET : Cette solution nécessite un analyseur de contrat personnalisé pour gérer les champs inconnus. Cependant, comprendre comment y parvenir peut s’avérer difficile.
Sérialiseur de contrat de données : Bien que le sérialiseur de contrat de données fournisse des événements pour la sérialisation et la désérialisation, il prend uniquement en charge le remplacement de méthodes spécifiques et n'offre pas de contrôle total sur la gestion des champs.
Sérialisation vers des objets dynamiques et mappage personnalisé : Cette approche consiste à désérialiser le JSON en un objet dynamique, puis à mapper manuellement les champs inconnus. Bien que cela soit possible, cela nécessitera probablement beaucoup de travail.
Héritage de DynamicObject : Les sérialiseurs qui s'appuient sur la réflexion pour la désérialisation peuvent ne pas parvenir à appeler les méthodes tryGetMember et trySetMember lorsqu'ils utilisent des classes qui héritent de DynamicObject.
Utilisez RESTSharp avec un sérialiseur personnalisé : La résolution de ce problème dans RESTSharp nécessite l'utilisation d'un sérialiseur personnalisé.
Meilleure solution utilisant JsonExtensionDataAttribute (JSON.NET v5) :
JSON.NET version 5 introduit JsonExtensionDataAttribute, qui offre un moyen plus simple et plus efficace de gérer les champs inconnus.
Exemple de code :
<code class="language-csharp">public class Product { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonExtensionData] public Dictionary<string, JToken> ExtraFields { get; set; } }</code>
Dans cet exemple, le dictionnaire ExtraFields contiendra des paires clé-valeur pour les champs inconnus dans le résultat JSON.
Conclusion :
En tirant parti de JsonExtensionDataAttribute dans JSON.NET version 5, les développeurs peuvent gérer efficacement les champs connus et inconnus dans les résultats JSON et accéder aux champs inconnus via le dictionnaire ExtraFields.
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!