web-dev-qa-db-fra.com

Newtonsoft JSON - Objets dynamiques

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

Le point de 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 ensuite ceci:

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

Ce code est en place depuis des mois et fonctionne correctement, mais dans une récente version de test, nous voyions l'erreur suivante:

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

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

Maintenant, c'est là que ça devient étrange, tout recommence à fonctionner si je change le code ci-dessus à partir 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 le corrige et quelle pourrait en être la cause. Est-ce que quelqu'un a des idées

39
MrEyes

Vous pouvez essayer ceci:

dynamic task = JObject.Parse(rawJson);

Documentation: Requête JSON avec dynamique

44
Hylaean

Dans mon cas, il s'est avéré que j'attrapais des exceptions de première chance, donc bien que cette exception soit levée, elle n'empêchait pas en fait mon code de s'exécuter.

Il serait toujours agréable de savoir pourquoi cela se produit pour certains contenus désérialisés par Json.NET, mais pas pour tout le contenu. Par exemple, j'ai un objet dynamique que je sérialise avec json.net dans un test unitaire, puis désérialise le contenu sérialisé. Le contenu sérialisé semble identique au contenu qui, au moment de l'exécution, provoque la levée des exceptions de liant d'exécution.

5
Shaun Wilson

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.

Accédez à 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.

4
DaNeSh

Il s'agit certainement d'un problème de référencement, je viens d'avoir le même problème, il s'est avéré que j'avais ajouté le dossier des packages au projet afin de pouvoir l'archiver dans VSS (désolé, obligatoire), dès que j'ai supprimé le dossier de packages de Visual Studio, il a commencé à bien fonctionner

1
BlackTigerX

J'ai eu le même problème avec une application utilisant Json.NET. Le problème ne s'est reproduit 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 supprimé de GAC, l'application a commencé à fonctionner correctement.

1
v.shashenko

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

1
E Perl