2012-11-03 8 views
7

miei feed JSON ha nidificato oggetti come questo:Parsing oggetti nidificati JSON con 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" 
    } 
} 
} 

e le mie classi di oggetti sono come questo:

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

    } 
} 

cerco di analizzare i miei dati JSON con codice seguente

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

ma ottengo il seguente errore:

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. 

Non riesco nemmeno a analizzare il valore nell'oggetto principale. Ad ogni modo per risolvere questo problema? e come posso analizzare un valore all'interno di un oggetto nidificato? per esempio: "punti" in "rank"

+0

Basta chiedersi come hai deserializzato 'residenza',' paese', 'regione' in classi C#. Sto avendo il problema simile. Puoi per favore postare il codice. – Venky

risposta

19

Come il messaggio di errore dice, la tua proprietà rank nella classe .NET è un List<Rank>, ma nel tuo JSON è solo un oggetto nidificato, non un array. Cambialo a solo un Rank invece di un List<Rank>.

Gli array in JSON (o qualsiasi javascript, in realtà) sono inclusi nello []. I caratteri {} specificano un singolo oggetto. Il tipo CLR deve corrispondere approssimativamente al tipo JSON per deserializzare. Oggetto da obiettare, da matrice ad array.

+0

grazie. quella era la soluzione – dum

+0

Vecchio post, ma oggi mi ha aiutato molto. risparmio di tempo –

+0

Quindi qual è la soluzione? Devi creare un wrapper per l'elenco ? Qualunque soluzione più pulita? – sky91