Newtonsoft JSON – Objets dynamics

J’utilise la bibliothèque JSON Newtonsoft pour effectuer une désérialisation dynamic sur le JSON brut entrant et j’ai trouvé quelque chose que je ne peux tout simplement pas expliquer.

Le sharepoint départ est la chaîne JSON suivante:

{ "task": { "dueDate": "2012-12-03T00:00:00" } } 

Rien de trop complexe là-bas …

Dans le code, je fais ceci:

 var dyn = JsonConvert.DeserializeObject(rawJson); DateTime dueDate = dyn.task.dueDate.Value; 

Ce code a été mis en place pendant des mois et fonctionne correctement, mais dans une version de test récente, nous avons constaté l’erreur suivante:

‘Newtonsoft.Json.Linq.JObject’ ne contient pas de définition de ‘tâche’

Trace de stack: at CallSite.Target (Closure, CallSite, Object) à System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0, TRet] (site CallSite, T0 arg0)

Maintenant, c’est là où ça devient étrange, tout recommence à fonctionner si je change le code ci-dessus de:

 DateTime dueDate = dyn.task.dueDate.Value; 

à

 DateTime dueDate = dyn["task"]["dueDate"].Value; 

Donc, bien que ce soit “corrigé”, je ne comprends pas pourquoi cela résout le problème et quelle pourrait en être la cause. Est-ce que quelqu’un a des idées

Vous pouvez essayer ceci:

 dynamic task = JObject.Parse(rawJson); 

Documentation: interrogation de JSON avec dynamic

Dans mon cas, il s’est avéré que j’attrapais des exceptions de première chance, alors même si cette exception était levée, cela n’empêchait pas mon code de s’exécuter.

Il serait toujours intéressant de savoir pourquoi cela se produit pour certains contenus désérialisés par Json.NET, mais pas tous. Par exemple, j’ai un object dynamic que je sérialise avec json.net dans un test unitaire, puis désérialise le contenu sérialisé. Le contenu sérialisé est identique au contenu qui, au moment de l’exécution, provoque la levée des exceptions du classeur d’exécution.

J’ai eu le même problème.

Json.NET 6.0.4 est à l’origine de ce problème. Vous devez le remplacer par Json.Net 6.0.5. Aucun projet ne doit faire référence à Json.NET 6.0.4.

Allez dans Outils -> Gestionnaire de packages NuGet -> Gérer les packages NuGet pour la solution … et vérifiez si l’un des projets utilise Json.NET 6.0.4, corrigez-les.

Ceci est certainement un problème de référencement, j’ai juste eu le même problème, il s’est avéré que le problème était que j’avais ajouté le dossier de paquets au projet afin que je puisse le vérifier dans VSS (désolé, obligatoire), dossier de paquets de visual studio, il a bien fonctionné

J’ai eu ce problème pendant un certain temps, s’avère, la DLL utilisée a été compilée pour .NET 3.5 qui ne prenait pas en charge dynamic …. Assurez-vous que votre DLL est compilée pour .NET 4.5 et supérieur

J’ai eu le même problème avec une application utilisant Json.NET. Le problème ne s’est produit que sur une machine spécifique et il s’est avéré que la machine avait une autre version de Json.NET installée dans GAC. Après l’avoir retiré de GAC, l’application a commencé à fonctionner correctement.