我正在使用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(闭包、CallSite、Object)System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](调用站点站点,T0 arg0)
现在这就是is变得奇怪的地方,如果我将上面的代码从更改为
DateTime dueDate = dyn.task.dueDate.Value;
至
DateTime dueDate = dyn["task"]["dueDate"].Value;
所以,尽管这是"固定的",我不明白为什么这会修复它,以及可能的原因是什么。有人知道吗
你可以试试这个:
dynamic task = JObject.Parse(rawJson);
文档:使用动态查询JSON
在我的情况下,结果发现我捕获了第一次机会异常,所以尽管抛出了这个异常,但实际上并没有阻止我的代码执行。
如果能知道为什么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,请修复它们。
这肯定是一些引用问题,我只是遇到了同样的问题,原来问题是我已经将packages文件夹添加到了项目中,这样我就可以在VSS中签入它(对不起,这是强制性的),当我从visual studio中删除packages时,它就开始正常工作
这个问题持续了一段时间,结果发现,使用的DLL是为.NET 3.5编译的,它不支持动态。。。。确保您的DLL是为.NET 4.5及更高版本编译的
我在使用Json.NET的应用程序中遇到了同样的问题。该问题仅在一台特定的计算机上重复出现,结果发现该计算机在GAC中安装了另一个版本的Json.NET。从GAC中删除后,应用程序开始正常工作。
我遇到过类似的问题,因为我有一个项目在做很多动态的事情。
我把范围缩小到。。。。。JsonElement和序列化。使用Dynamic,底层类型存在,并且序列化为JSON,它应该将该对象序列化为什么?动态可以是:字符串、数字、日期时间、True、false等,所以他们也需要放一些元数据,这样当你引用动态时,它就知道在序列化
所以。。。当您序列化时,我相信动态会转换为JsonElement——指定一个ValueKind和一个Value作为属性。
当你反序列化时,事情会变得复杂。。。JSON到C#将匹配类中的属性,如果它的动态作为目的地,则需要根据JSON元素信息恢复动态。
这就是事情变得模糊的地方,但我确信,如果你研究序列化,你会看到ValueKind,你很可能会在另一边遇到问题。
还要注意Text.Json(MS)的反序列化和序列化,因为我相信它们在newtonsoft和MS处理动力学的序列化和反序列化方面有所不同。