我正在尝试在 Windows 窗体应用程序中反序列化一些 Json。我尝试使用的代码与其他迭代中的代码相同,使用不同的 Json 和对象。在试图弄清楚的过程中,我偶然发现了一些非常基本的代码,我认为这些代码可以应用于我的情况。因此,在另一个项目(一个控制台应用程序)中,我粘贴了以下代码:
string json = @"{'Id': 1, 'Name': 'biofractal'}";
var results = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(results.Id);
这在控制台应用程序中运行良好,但是当我将其发布到我的第一个应用程序中时,它会导致异常。
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
Newtonsoft.Json.Linq.JObject does not contain a definition for 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 关键字可能会导致反序列化问题 - 本文对此进行了很好的解释: Anonymous Types are Internal 。这可能是您收到 RuntimeBindingException 的原因。
关于c# - JsonConvert.DeserializeObject 在一个项目中工作,但在另一个项目中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35775121/