Parsing nested JSON objects with JSON.NET

c#, deserialization, json, json.net

Solution

Like the error message says, your `rank` property in the .NET class is a `List<Rank>`, but in your JSON it's just a nested object, not an array. Change it to just a `Rank` instead of a `List<Rank>`.

Arrays in JSON (or any Javascript, really) are enclosed in `[]`. The `{}` characters specify a single object. The CLR type has to roughly match the JSON type in order to deserialize. Object to object, array to array.

Problem

My JSON feed has nested objects like this: ``` { "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" } } } ``` and my object classes are like this: ``` 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; } } } ``` I try to parse my JSON data with following code ``` 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; } ``` but I get the following error: ``` 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. ``` I can't even parse the value in the main object. Anyway to fix this? and how can I parse a value inside of a nested object? for example: "points" in "rank"

Original source