2013-09-21 4 views
0

Я уверен, что ответ на этот вопрос очень прост, но у меня проблемы. У меня есть следующая строка JSON (предоставленная Yahoo Fantasy Sports API), которую я пытаюсь проанализировать в своих объектах модели из JSON.NET JToken. Поскольку я не хочу заманивать свой проект кучей классов специально для поддержки JSON-анализа, я пытаюсь сделать это вручную. Тем не менее, я не могу в своей жизни выяснить в коде, как определить, есть ли я в случае настроек или в случае с командами. Помогите?Как различить элементы JArray.NET JARray

{ 
    "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; 
} 

Я не хочу, чтобы жёстко, потому что я мог бы загрузить более/разные subresources из лиги так не гарантируется, что он всегда будет содержать эту структуру.

ответ

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

Sweet. Я заметил, что при отладке и использовании индексирования массива с несуществующими индексами он генерирует исключение, поэтому я не думал проверять значение null. Но он не делает этого в скомпилированном коде, так что это работает. – sohum

Смежные вопросы