C# Newtonsoft JSON-动态对象

C# Newtonsoft JSON-动态对象,c#,json,dynamic,deserialization,json.net,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.Val

我正在使用Newtonsoft JSON库对传入的原始JSON执行动态反序列化,发现了一些我无法解释的问题

起点是以下JSON字符串:

{
  "task": {
    "dueDate": "2012-12-03T00:00:00"
  }
}
没什么太复杂的

在代码中,我会这样做:

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

所以,虽然这是“固定的”,我不明白为什么这会固定它,以及可能的原因是什么。有人有什么想法吗?你可以试试这个:

dynamic task = JObject.Parse(rawJson);

文档:

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

我在使用Json.NET的应用程序中遇到了同样的问题。这个问题只在一台特定的机器上再次出现,结果证明该机器在GAC中安装了另一个版本的Json.NET。将其从GAC中删除后,应用程序开始正常工作。

在我的情况下,结果发现我捕获了第一次机会的异常,因此,尽管抛出了此异常,但实际上并没有阻止代码执行


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

我也遇到了同样的问题

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

转到工具->NuGet软件包管理器->管理解决方案的NuGet软件包。。。
然后检查,如果有任何项目使用Json.NET 6.0.4,请修复它们。

我有一段时间遇到这个问题,结果发现,使用的DLL是为.NET 3.5编译的,它不支持动态。。。。确保您的DLL是为.NET 4.5及以上版本编译的

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

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

所以。。。序列化时,我相信动态会转换为JsonElement—指定ValueKind和值作为属性

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

这就是事情变得模糊的地方,但我可以肯定的是,如果你研究序列化,看到ValueKind,你可能会在另一边遇到问题


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

您是否更改了正在使用的Json.NET版本?不,这是我的第一个想法-查看代码和库上的更改历史显示,Live中的内容(和工作中的内容)没有任何更改。您确定这不是“第一次机会例外”吗?这是dynamics的典型情况(可能您在错误登录等中增加了详细信息级别)?使用最新版本的Json.NET进行的一个小测试表明,您的代码可以正常工作-因此这里没有回归。进一步调查这是一个环境问题,我将这些库带到了开发环境中,它们工作正常。这是测试环境的一个问题,可能是.NET版本或其他什么,因为他要求理解为什么它在提供的示例中不起作用,因为它应该适用于提供的示例。小问题:您必须知道它是对象还是数组,并使用JObject.Parse()或JArray.Parse()。换言之,您需要事先知道是否正在对上的数组或对象进行反序列化。动态t1=JObject.Parse(@“[{'a':10}]”)//fail dynamic t2=JArray.Parse(@“[{'a':10}]”)//传递动态t3=JObject.Parse(@“{'a':10}”)//传递动态t4=JArray.Parse(@“{'a':10}”)//记录失败,与Json.NET 6.0.3的问题相同。修正了最新版本7.0.1。有趣的是,我下载了Newtonsoft.JSON源代码并搜索了“task”。在测试方法中输入原始JSON。。。谁知道为什么会发生这种情况,但Newtonsoft中有人一直在读这篇文章。看起来底线是这是(或曾经是)库中的一个bug。这对我来说也是同样的问题!哎哟!很遗憾听到这个消息。
DateTime dueDate = dyn["task"]["dueDate"].Value;
dynamic task = JObject.Parse(rawJson);