Maison  >  Article  >  développement back-end  >  Comment résoudre le problème de l'échec de la désérialisation des valeurs d'attribut ?

Comment résoudre le problème de l'échec de la désérialisation des valeurs d'attribut ?

零下一度
零下一度original
2017-06-23 16:22:114246parcourir

Introduction : Lorsque je développais l'interface webapi, j'ai rencontré : Lorsqu'une chaîne Json complexe est désérialisée en un objet, l'un des objets d'attribut ne peut pas être sérialisé ?

Utilisation :

InternalRecommendRequestFormModel formData = Newtonsoft.Json.JsonConvert.DeserializeObject<InternalRecommendRequestFormModel>(dataInput);

Parmi eux : InternalRecommendRequestFormModel est un objet complexe et ses propriétés contiennent d'autres objets et propriétés. dataInput est la chaîne JSON transmise par l'interface, qui est l'objet InternalRecommendRequestFormModel renvoyé par une autre interface. Bien sûr, certaines propriétés des données ont changé au cours du processus de transmission. Elles doivent être désérialisées normalement, mais elles sont désérialisées lorsqu'elles sont utilisées. une erreur est signalée et l'un des attributs ne peut pas être sérialisé.

Alors, que devons-nous faire lorsque nous rencontrons une désérialisation aussi complexe en objets ?

Tout d'abord : l'analyse montre que l'erreur est causée par l'échec de la sérialisation d'attributs individuels, donc tant que ces attributs peuvent être effacés ou que le contenu sérialisé de l'attribut peut être supprimé, tout ira bien.

Alors : Comment supprimer certains attributs de la chaîne JSON sérialisée ?

La première chose à laquelle on pense est le remplacement des cordes, l'effacement, l'interception, etc., mais il est facile de faire des erreurs. Pouvons-nous transformer cette chaîne en un objet exploitable (bien sûr pas InternalRecommendRequestFormModel), puis tuer ou effacer un objet, puis le convertir en l'objet souhaité ? En fait, lorsque j’ai pensé pour la première fois à un objet, n’importe quel objet n’est-il pas un objet ?

Commencez à essayer :

object formData = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(dataInput);

L'objet obtenu est le suivant :

Découvert lors du débogage :

((Newtonsoft.Json.Linq.JObject)(JsonConvert.DeserializeObject(dataInput))).ChildrenTokens[46], je peux obtenir la valeur de l'attribut.

En d'autres termes, comme le montre le code ci-dessus, l'objet objet désérialisé est converti en : Objet Newtonsoft.Json.Linq.JObject Cet objet est une classe de base de l'objet JSON fourni par Microsoft. , c'est-à-dire que tant que vous êtes un objet, s'il est sérialisé par json, cela peut vous aider à le désérialiser.

Le code est amélioré à :

InternalRecommendRequestFormModel formData = new InternalRecommendRequestFormModel();Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);
obj.Remove("opinions");
formData = obj.ToObject<InternalRecommendRequestFormModel>();

Résumé :

Tant que la chaîne JSON est un objet, lorsque nous désérialisons directement et constatons que certaines valeurs d'attribut dans la chaîne ne répondent pas aux exigences, nous pouvons d'abord convertir l'objet en : JObject, corriger les attributs de l'objet , puis utilisez JObject pour fournir ToObject() puis convertissez-le en objet qui doit être converti

<strong><span style="font-size: 15px">Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);</span></strong><br>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn