【问题标题】:(JSON.NET) RuntimeBinderException accessing dynamic JObject (works on one PC, fails on another)(JSON.NET) RuntimeBinderException 访问动态 JObject(在一台 PC 上工作,在另一台 PC 上失败)
【发布时间】:2016-03-10 11:57:48
【问题描述】:

我使用 Json.net 将 json 字符串反序列化为动态对象:

var initialJSON = "{ 'artillery': { 'status': '0', 'code': '' }, 'diplomacy': { 'status': '0', 'code': '' }, 'seccheck': { 'status': '0', 'code': '' }, 'march': { 'status': '0', 'code': '' }, 'production': { 'status': '0', 'code': '' }, 'water': { 'status': '0', 'code': '' }, 'technology': { 'status': '0', 'code': '' }, 'spy': { 'status': '0', 'code': '' }, 'weapon': { 'status': '1', 'code': '' }, 'raid': { 'status': '0', 'code': '' }, 'prod_artillery': { 'status': '1', 'code': '' }, 'prod_bio': { 'status': '1', 'code': '' }, 'prod_nuclear': { 'status': '1', 'code': '' }, 'prod_hacking': { 'status': '1', 'code': '' }, 'prod_covops': { 'status': '1', 'code': '' }, 'prod_tank': { 'status': '1', 'code': '' }, 'prod_infantry': { 'status': '1', 'code': '' }, 'prod_fighter': { 'status': '1', 'code': '' }, 'prod_ship': { 'status': '1', 'code': '' }, 'prod_submarine': { 'status': '1', 'code': '' }, 'prod_general': { 'status': '1', 'code': '' }, 'weapon_bio': { 'status': '1', 'code': '' }, 'weapon_nuclear': { 'status': '1', 'code': '' }, 'weapon_covops': { 'status': '1', 'code': '' }, 'weapon_hacking': { 'status': '1', 'code': '' } }";
var actionData = JsonConvert.DeserializeObject<dynamic>(initialJSON);

我正在与一位同事开展团队基础服务器项目。 反序列化后,我可以访问如下属性:

actionData.production.status = "1";

但是当我的同事运行同一行代码时,他得到了一个 RuntimeBinderException:

“actionData.production”抛出了一个类型为“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”动态的异常

'Newtonsoft.Json.Linq.JObject' 不包含对 '生产'

比较时我们注意到他没有在 actionData 上获得“动态视图”:

我的观点:

他的观点:

这怎么可能?

我们比较了我们的调试器/异常设置,它们是 100% 相等的。 VS 版本相同,TFS 等项目版本相同。

我绝对知道我可以避免动态并使用真实的对象。

但我非常好奇这种差异可能来自哪里。

【问题讨论】:

  • 您使用的是相同版本的 Json.NET 吗?你可以通过Debug.WriteLine("Json.NET version: " + typeof(JToken).Assembly.FullName);看到。
  • 我们的版本相同(7.0.0.0)

标签: c# linq visual-studio dynamic json.net


【解决方案1】:

我在 VS 2012 中遇到了同样的问题。要解决此问题,您必须在解决方案中启用“仅我的代码”。 转到工具 -> 选项 -> 调试 -> 常规,然后点击“仅启用我的代码”框,按确定。现在应该可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多