2012-11-03 15 views
7

Mój feed JSON jest zagnieżdżone obiekty tak:Parsing obiekty zagnieżdżone JSON z 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" 
    } 
} 
} 

i moje klas obiektów są tak:

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

    } 
} 

próbuję analizować moje dane JSON z poniższy kod

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

ale pojawia się następujący błąd:

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. 

Nie mogę nawet przeanalizować wartości w głównym obiekcie. W każdym razie to naprawić? i jak mogę analizować wartość wewnątrz zagnieżdżonego obiektu? na przykład: "punkty" w "rankingu"

+0

Zastanawiasz się, w jaki sposób deserializujesz "residence", "country", "region" na klasy C#. Mam podobny problem. Czy możesz opublikować kod? – Venky

Odpowiedz

19

Właściwość rank w klasie .NET to List<Rank>, ale w twoim JSONie jest to tylko obiekt zagnieżdżony, a nie tablica. Zmień go na Rank zamiast na List<Rank>.

Tablice w języku JSON (lub dowolnym JavaScriptu) są zawarte w []. Znaki {} określają pojedynczy obiekt. Typ CLR musi z grubsza odpowiadać typowi JSON, aby deserializować. Obiekt do obiektu, tablica do tablicy.

+0

dzięki. to było rozwiązanie – dum

+0

Stary post, ale dziś bardzo mi to pomogło. Oszczędność czasu –

+0

Jakie jest rozwiązanie? Musisz utworzyć opakowanie dla listy ? Jakiekolwiek czystsze rozwiązanie? – sky91

Powiązane problemy