如何辨别JSON.NET JArray元素

时间:2013-09-21 14:59:34

标签: c# json json.net

我确信答案非常简单,但我遇到了麻烦。我有以下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;
}

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

1 个答案:

答案 0 :(得分: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
{
    // ...
}