2016-01-01 5 views
8

Я пытаюсь создать приложение UWP, используя API RIOT для League of Legends.Deserialize json в классы C#

Когда я иду на свой сайт, чтобы генерировать JSON я получаю что-то вроде этого:

{"gigaxel": { 
    "id": 36588106, 
    "name": "Gigaxel", 
    "profileIconId": 713, 
    "revisionDate": 1451577643000, 
    "summonerLevel": 30 
}} 

Когда я выбираю этот JSON и скопировать его в новый класс, используя специальный метод пасты в Visual Studio 2015 я получаю эти классы с такими свойствами:

public class Rootobject 
{ 
    public Gigaxel gigaxel { get; set; } 
} 

public class Gigaxel 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public int profileIconId { get; set; } 
    public long revisionDate { get; set; } 
    public int summonerLevel { get; set; } 
} 

Я создал новый класс LOLFacade для подключения к RiotAPI:

public class LOLFacade 
{ 
    private const string APIKey = "secret :D"; 

    public async static Task<Rootobject> ConnectToRiot(string user,string regionName) 
    { 
     var http = new HttpClient(); 
     string riotURL = String.Format("https://{0}.api.pvp.net/api/lol/{0}/v1.4/summoner/by-name/{1}?api_key={2}",regionName, user, APIKey); 
     var response = await http.GetAsync(riotURL); 

     var result = await response.Content.ReadAsStringAsync(); 

     return JsonConvert.DeserializeObject<Rootobject>(result); 

    } 

} 

Это кнопка метод обработчика событий:

 Rootobject root = new Rootobject { gigaxel = new Gigaxel() }; 
     root = await LOLFacade.ConnectToRiot("gigaxel","EUNE"); 
     string name = root.gigaxel.name; 
     int level = root.gigaxel.summonerLevel; 

     InfoTextBlock.Text = name + " is level " + level; 

я жестко закодировал regionName и пользователя для целей тестирования. Это работает с моим именем пользователя: «gigaxel».
Когда я пытаюсь другое имя, например, как «xenon94» я получаю исключение:

Object reference not set to an instance of an object. 

Когда я изменить имя свойства в Rootobject от gigaxel к xenon94 так:

public class Rootobject 
{ 
    public Gigaxel xenon94 { get; set; } 
} 

Когда я перекомпилировать мой код работает для имени пользователя xenon94, но он не работает для моего имени пользователя "gigaxel".
Я хочу, чтобы он работал для любого имени пользователя.

+0

Взгляните на JObject Newtonsoft. Они позволяют вам анализировать json в динамический объект, с которым вы можете манипулировать, и получить интересующую вас деталь, см. Http://stackoverflow.com/questions/11047708/c-sharp-manipulating-json-data – user1778606

ответ

7

Проблема заключается в том, что объект json имеет свойство с именем gigaxel. Вы должны будете получить внутренний объект, например, так:

var json = JsonConvert.DeserializeObject<JObject>(x).First.First; 

Оттуда вы можете получить имя и другие вещи индексатор:

string name = (string)json["name"]; 
int summonerlevel = (int)json["summonerLevel"] 

разработать, в JsonConvert.DeserializeObject (х) вернет новый объект JObject, который имеет только один объект. Следовательно, Первый вызов. Более того, этот объект имеет только одно свойство, называемое «гигаксель». Значение этого свойства - требуемая информация, например. имя. Мы хотим получить эту информацию независимо от имени свойства. Поэтому мы снова вызываем Сначала, чтобы получить значение этого свойства.