2012-11-03 46 views
7

thức ăn JSON của tôi đã lồng đối tượng như thế này:Parsing đối tượng lồng nhau JSON với JSON.NET

{ 
"id": 1765116, 
"name": "StrozeR", 
"birth": "2009-08-12", 
"avatar": "http:\/\/static.erepublik.com\/uploads\/avatars\/Citizens\/2009\/08\/12\/f19db99e9baddad73981d214a6e576ef_100x100.jpg", 
"online": true, 
"alive": true, 
"ban": null, 
"level": 61, 
"experience": 183920, 
"strength": 25779.42, 
"rank": { 
    "points": 133687587, 
    "level": 63, 
    "image": "http:\/\/www.erepublik.com\/images\/modules\/ranks\/god_of_war_1.png", 
    "name": "God of War*" 
}, 
"elite_citizen": false, 
"national_rank": 6, 
"residence": { 
    "country": { 
     "id": 81, 
     "name": "Republic of China (Taiwan)", 
     "code": "TW" 
    }, 
    "region": { 
     "id": 484, 
     "name": "Hokkaido" 
    } 
} 
} 

và các lớp đối tượng của tôi là như thế này:

class Citizen 
{ 
    public class Rank 
    { 
     public int points { get; set; } 
     public int level { get; set; } 
     public string image { get; set; } 
     public string name { get; set; } 
    } 
    public class RootObject 
    { 
     public int id { get; set; } 
     public string name { get; set; } 
     public string avatar { get; set; } 
     public bool online { get; set; } 
     public bool alive { get; set; } 
     public string ban { get; set; } 
     public string birth { get; set; } 
     public int level { get; set; } 
     public int experience { get; set; } 
     public double strength { get; set; } 
     public List<Rank> rank { get; set; } 

    } 
} 

tôi cố gắng để phân tích dữ liệu JSON của tôi với mã sau

private async void getJSON() 
{ 
    var http = new HttpClient(); 
    http.MaxResponseContentBufferSize = Int32.MaxValue; 
    var response = await http.GetStringAsync(uri); 

    var rootObject = JsonConvert.DeserializeObject<Citizen.RootObject>(response); 
    uriTB.Text = rootObject.name; 
    responseDebug.Text = response; 
} 

nhưng tôi gặp lỗi sau:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Erepublik.Citizen+Rank]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. 

Tôi thậm chí không thể phân tích cú pháp giá trị trong đối tượng chính. Dù sao để sửa lỗi này? và làm thế nào tôi có thể phân tích một giá trị bên trong của một đối tượng lồng nhau? ví dụ: "điểm" trong "xếp hạng"

+0

Chỉ cần tự hỏi làm cách nào bạn deserialize 'residence',' country', 'region' thành các lớp C#. Tôi đang gặp vấn đề tương tự. Bạn có thể xin vui lòng gửi mã. – Venky

Trả lời

19

Giống như thông báo lỗi cho biết, thuộc tính rank của bạn trong lớp .NET là List<Rank>, nhưng trong JSON của bạn, đó chỉ là đối tượng lồng nhau chứ không phải mảng. Thay đổi nó thành chỉ Rank thay vì List<Rank>.

Mảng trong JSON (hoặc bất kỳ Javascript nào, thực sự) được đính kèm trong []. Các ký tự {} chỉ định một đối tượng. Loại CLR phải gần khớp với loại JSON để deserialize. Đối tượng với đối tượng, mảng vào mảng.

+0

cảm ơn. đó là giải pháp – dum

+0

Bài cũ, nhưng hôm nay nó đã giúp tôi rất nhiều. tiết kiệm thời gian –

+0

Vì vậy, giải pháp là gì? Bạn cần tạo trình bao bọc cho Danh sách ? Bất kỳ giải pháp sạch hơn? – sky91

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