我想要创建一个Windows窗体应用程序,该应用程序使用足球-data.org中的数据。这是我第一次使用restful/JSON,而且我被困住了。
当我试图获得足球-data.org提供的所有联赛时,这就是从Foodo-data.org api:响应获得的响应。
我使用以下代码使所有数据正确:(lbResultBox是一个列表框)
private void btAllLeagues_Click(object sender, EventArgs e)
{
lbResultBox.Items.Clear();
List<Leagues> LL = GetLeagues("soccerseasons");
foreach (var item in LL)
{
lbResultBox.Items.Add(item.caption);
}
}
public static List<Leagues> GetLeagues(string endurl)
{
var syncClient = new WebClient();
var content = syncClient.DownloadString(baseurl + endurl);
return JsonConvert.DeserializeObject<List<Leagues>>(content);
}
public class Leagues
{
public IDictionary<string,LeagueLinks> _links { get; set; }
public string caption { get; set; }
public string league { get; set; }
public string year { get; set; }
public string numberOfTeams { get; set; }
public string numberOfGames { get; set; }
public string lastUpdated { get; set; }
}
public class LeagueLinks
{
public string href { get; set; }
}这个很管用。
但是当我试图从一个联盟中得到所有的球队时,这就是我从api得到的响应。我使用以下代码:
private void btAllTeams_Click(object sender, EventArgs e)
{
List<LeagueTeams> LT = GetLeagueTeams("soccerseasons/" + id + "/teams");
}
public static List<LeagueTeams> GetLeagueTeams(string endurl)
{
var syncClient = new WebClient();
var content = syncClient.DownloadString(baseurl + endurl);
return JsonConvert.DeserializeObject<List<LeagueTeams>>(content);
}
public class LeagueTeams
{
public IDictionary<string, LeagueLinks> _links { get; set; }
public string count { get; set; }
public IDictionary<string, LeagueTeam> teams { get; set; }
}
public class LeagueTeam
{
public IDictionary<string, TeamLinks> _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; }
}
public class TeamLinks
{
public string href { get; set; }
}但我得到了以下错误:
在System.Collections.Generic.IDictionary`2System.String,附加信息中出现了“Newtonsoft.Json.JsonSerializationException”类型的未处理异常:无法将当前JSON数组(例如,1,2,3)反序列化为类型FootballTestApplication.LeagueTeam‘,因为该类型需要一个JSON对象(例如,{“名称”:“值”})才能正确反序列化。
当我查看api给我的响应时,我可以看到响应是如何开始的。随着收集所有联赛,它开始和结束与括号([]),但当收集球队在一个联盟,它不是开始或结束与括号。当我自己添加括号时,我仍然会得到错误。我是这样添加括号的:
return JsonConvert.DeserializeObject<List<LeagueTeams>>("["+content+"]");我在这里做错什么了?
发布于 2015-05-12 19:05:00
问题在于,返回的JSON不是-- Array、List、Dictionary或其他Enumerable --而是它自己的object。
如果我们从API链接中获取您的JSON并逐个元素地检查它,我们将了解到您的Type是错误的。
您告诉JSON序列化程序,根对象是一个List<LeagueTeams>,但它不是。它实际上是一个LeagueTeams对象。
如果我们对反序列化器进行了修改,并且对您的LeagueTeams类进行了一些修改(主要是您反序列化了links属性这一事实),那么您就都设置好了:
public class LeagueTeams
{
public List<IDictionary<string, string>> _links { get; set; }
public string count { get; set; }
public List<LeagueTeam> teams { get; set; }
}
return JsonConvert.DeserializeObject<LeagueTeams>(content);我附上了结果的图片。

补充说明
另外要注意的是:JSONtoC#网站(http://json2csharp.com/)没有正确地处理这个JSON,它实际上生成了一个几乎是正确的对象,但不是完全正确的。(尽管所生成的对象仍将正常工作,但它并不是输入JSON的完全正确的映射。)这在一定程度上是由于发电机的错误,也是网站的错误。它试图为根Link项生成一个双属性links元素的列表,而应该使用字典列表来获得正确的映射。(不过,这有点让人费解,但这是最正确的方法。)另一件需要考虑的事情是,是的,这对于获得一个好的开始是很好的,但是一般来说,正确的JSON处理需要对生成的对象进行更细致的检查,以保证正确性。
https://stackoverflow.com/questions/30198743
复制相似问题