0

我确信这个问题的答案非常简单,但我遇到了麻烦。我有以下 JSON 字符串(由 Yahoo Fantasy Sports API 提供),我试图将其从 JSON.NET JToken 解析为我的模型对象。因为我不想在我的项目中乱扔一堆专门支持 JSON 解析的类,所以我正在尝试手动执行此操作。但是,我一生无法在代码中弄清楚如何确定我是在设置案例还是团队案例中。帮助?

{
   "league":[
      {
         "league_key":"somevalue",
         "name":"My League"
      },
      {
         "teams":{
            "0":{
               "team":[
                  [
                     // some data
                  ]
               ]
            },
            "1":{
               "team":[
                  [
                     // some data
                  ]
               ]
            },
            "count":2
         }
      }
   ]
}

以下是我用于解析的代码(到目前为止):

public League ParseJson(JToken token)
{
    var league = new League();
    if (token.Type == JTokenType.Array)
    {
        foreach (var child in token.Children<JObject>())
        {
            // how do I figure out if this child contains the settings or the teams?
        }
        return league;
    }
    return null;
}

我不想对其进行硬编码,因为我可能会从联盟加载更多/不同的子资源,因此不能保证它总是包含这种结构。

4

1 回答 1

1

只需检查子对象是否包含您想要的子资源中的已知属性(它也不在其他子资源之一中)。像这样的东西应该工作。您可以填写其余部分。

public League ParseJson(JToken token)
{
    var league = new League();
    if (token.Type == JTokenType.Array)
    {
        foreach (JObject child in token.Children<JObject>())
        {
            if (child["teams"] != null)
            {
                // process teams...
                foreach (JProperty prop in child["teams"].Value<JObject>().Properties())
                {
                    int index;
                    if (int.TryParse(prop.Name, out index))
                    {
                        Team team = new Team();
                        JToken teamData = prop.Value;

                        // (get team data from JToken here and put in team object)

                        league.Teams.Add(team);
                    }
                }
            }
            else if (child["league_key"] != null)
            {
                league.Key = child["league_key"].Value<string>();
                league.Name = child["name"].Value<string>();
                // (add other metadata to league object here)
            }
        }
        return league;
    }
    return null;
}

class League
{
    public League()
    {
        Teams = new List<Team>();
    }

    public string Key { get; set; }
    public string Name { get; set; }
    public List<Team> Teams { get; set; }
}

class Team
{
    // ...
}
于 2013-09-21T20:31:52.670 回答