如何辨别 JSON.NET JArray 元素

本文关键字:JArray 元素 NET JSON 何辨别 | 更新日期: 2023-09-27 18:32:11

我确信答案非常简单,但我遇到了麻烦。我有以下 JSON 字符串(由雅虎梦幻体育 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;
}

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

如何辨别 JSON.NET JArray 元素

只需检查子对象是否包含所需子资源的已知属性(该属性也不在其他子资源之一中)。 这样的事情应该有效。 您可以填写其余部分。

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
{
    // ...
}