Newtonsoft JSON - 动态对象

时间:2012-12-03 12:58:03

标签: c# json dynamic deserialization json.net

我正在使用Newtonsoft JSON库对传入的原始JSON执行动态反序列化,并找到了一些我无法解释的内容。

起点是以下JSON字符串:

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

那里没有太复杂......

在代码中,我正在这样做:

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

这段代码已经存在好几个月并且工作正常,但是在最近的测试版本中我们看到了以下错误:

  

'Newtonsoft.Json.Linq.JObject'不包含。的定义   '任务'

     

堆栈跟踪:在CallSite.Target(Closure,CallSite,Object)处   System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRET](调用点   网站,T0 arg0)

现在这就变得奇怪了,如果我改变上面的代码,一切都会再次开始工作:

DateTime dueDate = dyn.task.dueDate.Value;

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

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

7 个答案:

答案 0 :(得分:44)

你可以试试这个:

dynamic task = JObject.Parse(rawJson);

文档:Querying JSON with dynamic

答案 1 :(得分:5)

在我的情况下,事实证明我抓住了第一次机会异常,所以虽然抛出了这个异常但实际上并没有阻止我的代码执行。

知道为什么这会对Json.NET反序列化的某些内容发生这种情况仍然很好,但不是所有内容。例如,我有一个动态对象,我在单元测试中使用json.net序列化,然后反序列化序列化内容。序列化内容看起来与内容相同,在运行时,这些内容会导致运行时绑定程序异常被抛出。

答案 2 :(得分:4)

我遇到了同样的问题。

Json.NET 6.0.4导致此问题。您应该将其更改为Json.Net 6.0.5。 这个项目都不应该引用Json.NET 6.0.4。

转到工具 - &gt; NuGet包管理器 - &gt;管理NuGet包以获得解决方案...... 并检查,如果任何项目使用Json.NET 6.0.4,修复它们。

答案 3 :(得分:1)

这肯定是一些引用问题,我只是遇到了同样的问题,结果问题是我已经将packages文件夹添加到项目中,以便我可以在VSS中检查它(对不起,强制性),只要我从visual studio中删除了packages文件夹,它开始正常工作

答案 4 :(得分:1)

我使用Json.NET的应用程序遇到了同样的问题。该问题仅在一台特定的机器上重现,结果发现该机器在GAC中安装了另一个版本的Json.NET。从GAC中删除后,应用程序开始正常运行。

答案 5 :(得分:1)

我有这个问题持续了一段时间,事实证明,使用的DLL是为.NET 3.5编译的,它不支持动态....确保你的DLL是为.NET 4.5及以上版本编译的

答案 6 :(得分:0)

我有一个类似的问题,因为我有一个项目在做很多动态的事情。

我将范围缩小到了..... JsonElement和序列化。使用Dynamic,基础类型存在,并且序列化为JSON应该将该对象序列化为什么?动态可以是:字符串,数字,日期时间,True,false等。因此,它们也需要放一些元数据,以便当您引用动态时,它知道在序列化时会

所以...当您进行序列化时,我相信动态会转换为JsonElement-指定一个ValueKind和一个Value作为属性。

反序列化时,事情变得很复杂...将C#的JSON匹配类中的属性,并且如果将其动态作为目标,则需要根据JSON元素信息恢复动态。

这是使事情变得模糊的地方,但是我可以肯定地知道,如果您研究Serialzation,并且看到ValueKind,则您的另一端可能会遇到问题。

还请注意Text.Json(MS)的反序列化和序列化,因为我认为它们与newtonsoft和MS处理动态序列化和反序列化的方式有所不同。