反序列化后,我将内容保存在对象中:
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; }
}
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"
}
答案 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
。由于obj
为dynamic
,因此没有编译器错误,返回的Json.Net JObject
支持迭代。但是,它会一次性返回每个属性值(例如_links,name等),而不是您感兴趣的对象。