43

我正在使用 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 ) at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,Tret](CallSite site, T0 arg0)

现在这是变得奇怪的地方,如果我将上面的代码从以下位置更改,一切都会重新开始工作:

DateTime dueDate = dyn.task.dueDate.Value;

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

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

4

7 回答 7

51

你可以试试这个:

dynamic task = JObject.Parse(rawJson);

文档:使用动态查询 JSON

于 2012-12-07T16:38:32.853 回答
5

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

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

于 2013-12-23T09:04:00.333 回答
4

我有同样的问题。

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

转到工具 -> NuGet 包管理器 -> 管理 NuGet 包以获取解决方案...并检查是否有任何项目使用 Json.NET 6.0.4,修复它们。

于 2014-10-10T18:39:59.180 回答
2

这绝对是一些参考问题,我只是遇到了同样的问题,原来问题是我已经将包文件夹添加到项目中,以便我可以在 VSS 中签入它(对不起,强制性),只要我删除了来自visual studio的packages文件夹,它开始正常工作

于 2013-06-19T18:26:20.543 回答
1

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

于 2013-08-09T04:53:28.820 回答
1

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

于 2015-07-21T19:21:34.513 回答
0

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

我将其范围缩小到...... JsonElement 和序列化。使用 Dynamic,底层类型存在,序列化为 JSON 应该将该对象序列化为什么?动态可以是:字符串、数字、日期时间、真、假等,所以他们也需要放一些元数据,这样当你引用动态时,它知道在序列化时

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

当您反序列化时,事情变得复杂...... JSON 到 C# 将匹配类中的属性,如果它作为目标是动态的 - 需要根据 JSON 元素信息恢复动态。

这是事情变得模糊的地方,但我确定如果您查看序列化,并且您看到 ValueKind,那么您可能会在另一边遇到问题。

还要观看 Text.Json (MS) 反序列化和序列化,因为我相信它们是 newtonsoft 和 MS 如何处理动态序列化和反序列化的区别。

于 2020-09-15T21:59:54.923 回答