我正在尝试在我的Windows窗体应用程序中反序列化一些Json。我尝试使用的代码与其他迭代中的代码相同,使用不同的 JSON 和对象。在试图弄清楚时,我偶然发现了一些非常基本的代码,我认为我可以将其应用于我的情况。因此,在另一个控制台应用程序项目中,我粘贴了以下代码:
string json = @"{'Id': 1, 'Name': 'biofractal'}";
var results = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(results.Id);
这在控制台应用程序中工作正常,但是当我在第一个应用程序中发布它时,它会导致异常。
我引发的异常: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.竖琴.dll
Newtonsoft.Json.Linq.JObject 不包含 Id 的定义
检查了多次,我使用的是完全相同的代码,并且确实在文件的开头添加了using Newtonsoft.Json
。我四处搜索并听到提到清除 GAC 缓存或类似的东西,但我似乎找不到正确的文件。
这几乎可以肯定与动态的使用有关。
解决上述问题的最简单方法是不使用动态类型,并在代码中定义与 JSON 匹配的对象,如下所示:
class MyClass {
public int Id { get; set; }
public string Name { get; set; }
}
然后使用此类型进行反序列化:
var results = JsonConvert.DeserializeObject<MyClass>(json);
使用匿名类型时,dynamic 关键字可能会导致反序列化问题 - 本文很好地解释了它:匿名类型是内部类型。这可能是您获得 RuntimeBindingException 的原因。