JsonConvert.DeserializeObject在一个项目中工作,但在另一个项目中不工作
问题描述:
我想在我的Windows窗体应用程序中反序列化一些Json。我尝试使用的代码与其他迭代中使用的代码相同,使用不同的Json和对象。虽然试图找出我偶然发现了一些我认为可以应用于我的情况的非常基本的代码。因此,在另一个项目,这是一个控制台应用程序,我粘贴下面的代码:JsonConvert.DeserializeObject在一个项目中工作,但在另一个项目中不工作
string json = @"{'Id': 1, 'Name': 'biofractal'}";
var results = JsonConvert.DeserializeObject<dynamic>(json);
Console.WriteLine(results.Id);
这在控制台应用程序工作正常,但是当我在我的第一个应用程序发布它,它会导致异常。
抛出异常: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' 在 Microsoft.CSharp.dll
Newtonsoft.Json.Linq.JObject不包含定义标识
我检查了多次,并使用完全相同的代码,并且在文件的开头添加了using Newtonsoft.Json
。我搜索了四周,并听到提及清除GAC缓存或沿着这些线,但我似乎无法找到正确的文件。
答
这几乎肯定与动态的使用有关。
解决上述问题的最简单的方法是不使用动态类型和定义你的代码的对象相匹配的JSON如下:
class MyClass {
public int Id { get; set; }
public string Name { get; set; }
}
然后使用这个类型的deserialisation:
var results = JsonConvert.DeserializeObject<MyClass>(json);
动态关键字可以使用匿名类型时deserialisation导致问题 - 这篇文章解释了它相当不错: Anonymous Types are Internal。这可能是你得到RuntimeBindingException的原因。
['JObject'](http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JObject.htm)不是匿名类型;它是由Json.Net公开的公共和知名类型。 –
的确,但它没有Id属性。序列化创建一个JObject的事实表明动态变量没有正确绑定 - 链接更多的是背景信息,而不是这个特定情况的答案。如果有针对这种情况的答案,那么看起来会很有趣。 –
是的,我意识到这可能是一个更好的方式来处理这个特定的情况,但在我的第一个程序的情况下,Json是一个更复杂,我不得不做更多的课程。主要问题是,我发布的代码实际上在一个项目中工作,但不在另一个项目中,所以从技术上讲,它应该在任何项目中工作,对吧? –