2014-09-26 2 views
2

Я пытаюсь разобрать JSON, который возвращается мне в следующей структуре, но я просто не могу получить структуру класса правильно, чтобы он правильно разбирался:C# Parsing JSON numeric property, используя JSON.Net

{"44542152": [{ 
    "queue": "RANKED_SOLO_5x5", 
    "name": "Elise's Elite", 
    "entries": [{ 
     "leaguePoints": 0, 
     "isFreshBlood": false, 
     "isHotStreak": false, 
     "division": "IV", 
     "isInactive": false, 
     "isVeteran": false, 
     "playerOrTeamName": "Autdsm", 
     "playerOrTeamId": "44543152", 
     "wins": 11 
    }], 
    "tier": "SILVER" 
}]} 

Однако из-за «44542152»: корень JSON, который изменяется в зависимости от пользователя, я заказываю, я найти его трудно разобрать это в объект.

Это то, что я до сих пор:

public static AreTheyChallenger.Core.RankInfo getLeague(string region, Summoner summoner) 
    { 
     try 
     { 
      using (var webClient = new WebClient()) 
      { 
       var json = webClient.DownloadString("https://" + region + ".api.pvp.net/api/lol/" + region + "/v2.5/league/by-summoner/" + summoner.id + "/entry" + "?api_key=" + Keys.api_key); 
       var summonerRankInfo = JObject.Parse(json).Values().First().ToObject<RankInfo>(); 
       return summonerRankInfo; 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
     return null; 
    } 

И это класс я пытаюсь разобрать его в:

public class RankInfo 
{ 

    public class Entry 
    { 
     public int leaguePoints { get; set; } 
     public bool isFreshBlood { get; set; } 
     public bool isHotStreak { get; set; } 
     public string division { get; set; } 
     public bool isInactive { get; set; } 
     public bool isVeteran { get; set; } 
     public string playerOrTeamName { get; set; } 
     public string playerOrTeamId { get; set; } 
     public int wins { get; set; } 
    } 

    public class RootObject 
    { 
     public string queue { get; set; } 
     public string name { get; set; } 
     public List<Entry> entries { get; set; } 
     public string tier { get; set; } 
    } 

} 

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

Заранее спасибо.

+1

Попробуйте использовать это для создания своих классов: https://jsonclassgenerator.codeplex.com/ очень удобно IMO :) –

+0

Проблема очевидна, но решение обязательно нет. Хороший вопрос :) – Rhumborl

+0

Вы также можете использовать json2csharp, если вы не хотите ничего загружать. http://json2csharp.com/ – Mun

ответ

1

Вы очень близки.

Это должно быть RootObject [] в гипсе. Посмотрите на свой JSON снова ... это более полезно, если вы отступаете правильно. Это сопоставление строки с массивом объектов, а не с одним, и эти объекты являются вашим RootObject, а не RankInfo.

+0

Большое спасибо :) –

0

Ваш класс RankInfo не имеет членов, только определения классов. Возможно, вы хотели, чтобы у него был экземпляр RootObject?

Вы можете получить экземпляр RootObject слегка модифицируя JSON десериализации линию следующее:

var summonerRankInfo = JObject.Parse(json).Values().First().First.ToObject<RankInfo.RootObject>(); 

Вы также можете выполнить следующие действия (если вы собираетесь получить множественные RootObject S:

var summonerRankInfo = JObject.Parse(json).Values().First().ToObject<RankInfo.RootObject[]>(); 
+0

Большое спасибо, это в сочетании с ответом выше решило мою проблему. –

1

Возможно, вы захотите изменить свой вложенный класс, как показано ниже. Пожалуйста, дайте мне знать, было ли это намерение.

void Main() 
{ 
    string jsonString = "{'44542152': [{ 'queue': 'RANKED_SOLO_5x5', 'name': 'Elises Elite', 'entries': [{ 'leaguePoints': 0, 'isFreshBlood': false, 'isHotStreak': false, 'division': 'IV', 'isInactive': false, 'isVeteran': false, 'playerOrTeamName': 'Autism', 'playerOrTeamId': '44543152', 'wins': 11 }], 'tier': 'SILVER' }]}".Replace('\'','"'); 

    JObject jsonObject = JObject.Parse(jsonString); 
    JArray jsonArray = jsonObject.Values().First() as JArray; 
    var summonerRankInfo = jsonArray.First().ToObject<RootObject>(); 
} 

public class Entry 
{ 
    public int leaguePoints { get; set; } 
    public bool isFreshBlood { get; set; } 
    public bool isHotStreak { get; set; } 
    public string division { get; set; } 
    public bool isInactive { get; set; } 
    public bool isVeteran { get; set; } 
    public string playerOrTeamName { get; set; } 
    public string playerOrTeamId { get; set; } 
    public int wins { get; set; } 
} 

public class RootObject 
{ 
    public string queue { get; set; } 
    public string name { get; set; } 
    public List<Entry> entries { get; set; } 
    public string tier { get; set; } 
} 
+0

Это была одна из проблем, другая - то, что мне нужно было учитывать массив в json. –

+0

Проверьте переменную jsonArray. он хранит каждую запись учетной записи. – cilerler

+0

О, извините, я пропустил это, отличный ответ. Я улучшил свой код с этим - спасибо. –

0

Это то, что я сделал:

var data = JsonConvert.DeserializeObject<Dictionary<string,IList<RankInfo.RootObject>>>(json); 
var rankinfo = data["44542152"].First();