2016-01-01 26 views
8

Tôi đang cố tạo một ứng dụng UWP bằng cách sử dụng API RIOT cho Liên minh Huyền thoại.Deserialize json vào các lớp C#

Khi tôi đi đến trang web của họ để tạo ra JSON tôi nhận được một cái gì đó như thế này:

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

Khi tôi chọn JSON này và sao chép nó vào một lớp mới bằng cách sử dụng phương pháp dán đặc biệt trong Visual Studio 2015 tôi nhận được các lớp này với các đặc tính này:

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

tôi tạo ra một lớp mới gọi là LOLFacade để kết nối với các 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); 

    } 

} 

Đây là nút Thêm phương thức xử lý sự kiện:

 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; 

tôi cứng mã hoá các regionName và người sử dụng cho mục đích thử nghiệm. Điều này làm việc với tên người dùng của tôi: "gigaxel".
Khi tôi cố gắng một tên người dùng ví dụ như "xenon94" Tôi nhận được một ngoại lệ:

Object reference not set to an instance of an object. 

Khi tôi thay đổi tên sở hữu trong Rootobject từ gigaxel để xenon94 như thế này:

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

Khi tôi biên dịch lại mã của tôi nó hoạt động cho tên người dùng xenon94 nhưng nó không hoạt động cho tên người dùng của tôi "gigaxel".
Tôi muốn nó hoạt động với bất kỳ tên người dùng nào.

+0

hãy xem JOHNject của Newtonsoft. Chúng cho phép bạn phân tích cú pháp json thành một đối tượng động mà bạn có thể thao tác và nhận được phần mà bạn quan tâm, xem http://stackoverflow.com/questions/11047708/c-sharp-manipulating-json-data – user1778606

Trả lời

7

Vấn đề là đối tượng json có thuộc tính là có tên là gigaxel. Bạn sẽ phải lấy các đối tượng bên trong, như vậy:

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

Từ đó, bạn có thể có được tên và những thứ khác do indexer:

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

Xây dựng, các JsonConvert.DeserializeObject (x) sẽ trả về một JObject mới chỉ có một đối tượng. Do đó, Cuộc gọi đầu tiên. Hơn nữa, đối tượng này chỉ có một thuộc tính, có tên là "gigaxel". Giá trị của thuộc tính này là thông tin chúng tôi yêu cầu, ví dụ: Tên. Chúng tôi muốn truy xuất thông tin này bất kể tài sản được đặt tên là gì. Do đó, chúng tôi gọi lại Đầu tiên để truy lục giá trị của thuộc tính này.

Các vấn đề liên quan