Newtonsoft JSON - 动态对象

MrE*_*yes 39 c# json dynamic json.net deserialization

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

起点是以下JSON字符串:

{
  "task": {
    "dueDate": "2012-12-03T00:00:00"
  }
}
Run Code Online (Sandbox Code Playgroud)

那里没什么太复杂的......

在代码我然后这样做:

var dyn = JsonConvert.DeserializeObject<dynamic>(rawJson);
DateTime dueDate = dyn.task.dueDate.Value;
Run Code Online (Sandbox Code Playgroud)

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

'Newtonsoft.Json.Linq.JObject'不包含'task'的定义

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

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

DateTime dueDate = dyn.task.dueDate.Value;
Run Code Online (Sandbox Code Playgroud)

DateTime dueDate = dyn["task"]["dueDate"].Value;
Run Code Online (Sandbox Code Playgroud)

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

Hyl*_*ean 46

你可以试试这个:

dynamic task = JObject.Parse(rawJson);
Run Code Online (Sandbox Code Playgroud)

文档:使用动态查询JSON

  • 因为他要求理解为什么它在提供的示例中不起作用,因为***应该为所提供的示例工作. (11认同)
  • 这对我没有解决,同样的错误. (2认同)

Sha*_*son 5

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

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