Newtonsoft JSON – dynamic对象

我正在使用Newtonsoft JSON库对传入的原始JSON执行dynamic反序列化,并发现了一些我无法解释的东西。

起点是以下JSONstring:

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

那里没有太复杂的…

在代码中,我是这样做的:

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

这段代码已经存在好几个月了,可以正常工作,但是在最近的testing版本中,我们发现了以下错误:

“Newtonsoft.Json.Linq.JObject”不包含“任务”的定义

堆栈跟踪:在CallSite.Target(Closure,CallSite,对象)在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite站点,T0 arg0)

现在这是奇怪的地方,如果我改变上面的代码,一切都开始工作了:

 DateTime dueDate = dyn.task.dueDate.Value; 

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

所以,虽然这是“固定的”,但我不明白为什么这个问题会解决,可能的原因是什么。 有没有人有任何想法

你可以试试这个:

 dynamic task = JObject.Parse(rawJson); 

文档: 用dynamic查询JSON

在我的情况下,事实certificate,我正在捕捉第一次机会exception,所以虽然这个exception被抛出,事实上,这并不妨碍我的代码执行。

这仍然是很好的知道为什么这会发生一些由Json.NET反序列化的内容,但不是所有的内容。 例如,我有一个dynamic对象,我在unit testing中用json.net序列化,然后反序列化序列化的内容。 序列化的内容看起来与在运行时导致运行时绑定器exception被抛出的内容相同。

我有同样的问题。

Json.NET 6.0.4导致这个问题。你应该改变它到Json.Net 6.0.5。 没有一个项目应该引用Json.NET 6.0.4。

转到工具 – > NuGet包pipe理器 – >pipe理NuGet包解决scheme…并检查,如果任何项目使用Json.NET 6.0.4,修复它们。

这绝对是一个引用问题,我只是有同样的问题,原来的问题是,我已经添加到文件夹的项目,以便我可以检查在VSS(抱歉,强制),只要我删除从Visual Studio包文件夹,它开始工作正常

我有这个问题进行了一段时间,事实certificate,使用的DLL是编译的.NET 3.5不支持dynamic….请确保您的DLL编译为.NET 4.5及以上

我有一个使用Json.NET的应用程序的问题。 这个问题只在一台特定的机器上重现,事实certificate机器在GAC中安装了另一个版本的Json.NET。 从GAC中删除后,应用程序开始正常工作。