【问题标题】:JsonConvert.DeserializeObject working in one project but not in anotherJsonConvert.DeserializeObject 在一个项目中工作但不在另一个项目中
【发布时间】:2016-03-03 14:38:10
【问题描述】:

我正在尝试反序列化我的 Windows 窗体应用程序中的一些 Json。我尝试使用的代码与其他迭代中的代码相同,使用不同的 Json 和对象。在试图弄清楚时,我偶然发现了一些非常基本的代码,我认为我可以将其应用于我的情况。所以在另一个项目中,它是一个控制台应用程序,我粘贴了以下代码:

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 不包含 Id 的定义

我检查了多次,我使用的是完全相同的代码,我确实在文件开头添加了using Newtonsoft.Json。我四处搜索,听说清除 GAC 缓存或类似的东西,但我似乎找不到正确的文件。

【问题讨论】:

    标签: c# visual-studio json.net


    【解决方案1】:

    这几乎肯定与动态的使用有关。

    解决上述问题的最简单方法是不使用动态类型,并在代码中定义与 JSON 匹配的对象,如下所示:

    class MyClass {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    然后使用这种类型进行反序列化:

    var results = JsonConvert.DeserializeObject<MyClass>(json);
    

    动态关键字在使用匿名类型时可能会导致反序列化问题 - 这篇文章很好地解释了它: Anonymous Types are Internal。这可能是您获得 RuntimeBindingException 的原因。

    【讨论】:

    • JObject 不是匿名类型;是 Json.Net 公开的一种公知类型。
    • 确实如此,但它没有 Id 属性。序列化正在创建 JObject 的事实表明动态变量未正确绑定 - 链接更多的是背景信息,而不是此特定情况的答案。如果有针对此案例的特定答案,那将会很有趣。
    • 是的,我意识到这可能是处理这种特定情况的更好方法,但在我的第一个程序的情况下,Json 要复杂得多,我必须制作更多的类。主要问题是我发布的代码实际上在一个项目中有效,但在另一个项目中无效,所以从技术上讲,它应该适用于任何项目,对吧?
    • 我明白了,是的,假设在另一个项目中没有为该 JSON 结构定义对象。要检查的一般情况是两个项目都使用相同的 .NET 版本吗?
    • .NET 版本实际上存在差异,但是当我创建另一个新项目时,这次使用相同的版本,发生了完全相同的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多