运行时活页夹异常

时间:2015-06-24 16:32:20

标签: c# wpf

反序列化后,我将内容保存在对象中:

 var obj = JsonConvert.DeserializeObject<dynamic>(responseText);

所以我执行一个循环来填充DataGrid

foreach(var item in obj)
{ 
     MainWindow.AppWindow.Squadre_DataGrid.Items.Add(new Teams.Club_Information
     {
          code = item.code,
          name = item.name,
          shortName = item.shortName,
          squadMarketValue = item.squadMarketValue
     });
}

问题在于foreach内部编译器显示Runtime Binder Exception 为什么会这样?
更多细节:

班级结构

 public class Self
    {
        public string href { get; set; }
    }

    public class Fixtures
    {
        public string href { get; set; }
    }

    public class Players
    {
        public string href { get; set; }
    }

    public class Links
    {
        public Self self { get; set; }
        public Fixtures fixtures { get; set; }
        public Players players { get; set; }
    }

    public class RootObject
    {
        public Links _links { get; set; }
        public string name { get; set; }
        public string code { get; set; }
        public string shortName { get; set; }
        public string squadMarketValue { get; set; }
        public string crestUrl { get; set; }
    }

enter image description here

JSON结构:

{
"_links": {
     "self": { "href": "http://api.football-data.org/alpha/teams/19" },
     "fixtures": { "href": "http://api.football-data.org/alpha/teams/19/fixtures" },
     "players": { "href": "http://api.football-data.org/alpha/teams/19/players" }
   },
   "name": "Eintracht Frankfurt",
   "code": "SGE",
   "shortName": "Eintr. Frankfurt",
   "squadMarketValue": "75.475.000 ?",
   "crestUrl": "http://upload.wikimedia.org/wikipedia/commons/0/04/Eintracht_Frankfurt_Logo.svg"
}

1 个答案:

答案 0 :(得分:0)

要反序列化的对象不包含名为code的属性。因此,行code = item.code在运行时导致异常,因为dynamic后面的Json.Net对象不包含名为code的值。

这意味着您要解析的Json不包含名为code的属性。否则它有时只包含一个名为code的属性。在这种情况下,您必须要么解析它是JObject并检查属性是否存在或创建类型,请将其反序列化为。&#39;

<强> 修改

基于您在类结构中发布的Json,您看起来应该直接反序列化为RootObject类:

  var obj = JsonConvert.DeserializeObject<RootObject>(responseText);

或者在任何情况下,您仍然可以反序列化为dynamic但是您需要删除foreach,因为您没有RootObject

 var obj = JsonConvert.DeserializeObject<dynamic>(responseText);

MainWindow.AppWindow.Squadre_DataGrid.Items.Add(new Teams.Club_Information
{
    code = obj.code,
    name = obj.name,
    shortName = obj.shortName,
    squadMarketValue = obj.squadMarketValue
 });

你出错的地方是foreach。由于objdynamic,因此没有编译器错误,返回的Json.Net JObject支持迭代。但是,它会一次性返回每个属性值(例如_links,name等),而不是您感兴趣的对象。