首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能反序列化json足球数据

不能反序列化json足球数据
EN

Stack Overflow用户
提问于 2015-05-12 18:26:09
回答 1查看 557关注 0票数 3

我想要创建一个Windows窗体应用程序,该应用程序使用足球-data.org中的数据。这是我第一次使用restful/JSON,而且我被困住了。

当我试图获得足球-data.org提供的所有联赛时,这就是从Foodo-data.org api:响应获得的响应。

我使用以下代码使所有数据正确:(lbResultBox是一个列表框)

代码语言:javascript
复制
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得到的响应。我使用以下代码:

代码语言:javascript
复制
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给我的响应时,我可以看到响应是如何开始的。随着收集所有联赛,它开始和结束与括号([]),但当收集球队在一个联盟,它不是开始或结束与括号。当我自己添加括号时,我仍然会得到错误。我是这样添加括号的:

代码语言:javascript
复制
return JsonConvert.DeserializeObject<List<LeagueTeams>>("["+content+"]");

我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-12 19:05:00

问题在于,返回的JSON不是-- ArrayListDictionary或其他Enumerable --而是它自己的object

如果我们从API链接中获取您的JSON并逐个元素地检查它,我们将了解到您的Type是错误的。

您告诉JSON序列化程序,根对象是一个List<LeagueTeams>,但它不是。它实际上是一个LeagueTeams对象。

如果我们对反序列化器进行了修改,并且对您的LeagueTeams类进行了一些修改(主要是您反序列化了links属性这一事实),那么您就都设置好了:

代码语言:javascript
复制
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处理需要对生成的对象进行更细致的检查,以保证正确性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30198743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档