Imansible deserializzare l’array JSON in tipo – Json.NET

Sto provando a deserializzare un dato json in una class modello, ma sto fallendo. Ecco cosa faccio:

public CountryModel GetCountries() { using (WebClient client = new WebClient()) { var result = client.DownloadString("http://api.worldbank.org/incomeLevels/LIC/countries?format=json"); var output = JsonConvert.DeserializeObject<List>(result); return output.First(); } } 

Ecco come appare il mio modello:

 public class CountryModel { public int Page { get; set; } public int Pages { get; set; } public int Per_Page { get; set; } public int Total { get; set; } public List Countries { get; set; } } public class Country { public int Id { get; set; } public string Iso2Code { get; set; } public string Name { get; set; } public Region Region { get; set; } } public class Region { public int Id { get; set; } public string Value { get; set; } } 

Puoi vedere il Json che sto ricevendo qui: http://api.worldbank.org/incomeLevels/LIC/countries?format=json

Questo è l’errore che ottengo:

Imansible deserializzare l’array JSON nel tipo “Mvc4AsyncSample.Models.CountryModel”. Linea 1, posizione 1.

Devi scrivere un JsonConverter personalizzato:

  public class CountryModelConverter : JsonConverter { public override bool CanConvert(Type objectType) { if (objectType == typeof(CountryModel)) { return true; } return false; } public override object ReadJson(JsonReader reader, Type objectType , object existingValue, JsonSerializer serializer) { reader.Read(); //start array //reader.Read(); //start object JObject obj = (JObject)serializer.Deserialize(reader); //{"page":1,"pages":1,"per_page":"50","total":35} var model = new CountryModel(); model.Page = Convert.ToInt32(((JValue)obj["page"]).Value); model.Pages = Convert.ToInt32(((JValue)obj["pages"]).Value); model.Per_Page = Int32.Parse((string) ((JValue)obj["per_page"]).Value); model.Total = Convert.ToInt32(((JValue)obj["total"]).Value); reader.Read(); //end object model.Countries = serializer.Deserialize>(reader); reader.Read(); //end array return model; } public override void WriteJson(JsonWriter writer, object value , JsonSerializer serializer) { throw new NotImplementedException(); } } 

E CountryModel il CountryModel con quel convertitore (ho anche dovuto passare qualche int a string ):

  [JsonConverter(typeof(CountryModelConverter))] public class CountryModel { public int Page { get; set; } public int Pages { get; set; } public int Per_Page { get; set; } public int Total { get; set; } public List Countries { get; set; } } public class Country { public string Id { get; set; } public string Iso2Code { get; set; } public string Name { get; set; } public Region Region { get; set; } } public class Region { public string Id { get; set; } public string Value { get; set; } } 

Quindi dovresti essere in grado di deserializzare in questo modo:

 var output = JsonConvert.DeserializeObject(result); 

Questo sembra un (non molto buono) tentativo di rappresentare XML in JSON. Il JSON assomiglia a questo:

 [ { "page": 1, … }, [ { "id": "AFG", "name": "Afghanistan", … }, { "id": "BDI", "name": "Burundi", … }, … ] ] 

Mentre un JSON ragionevole (che potrebbe incidentalmente mappare al modello in modo appropriato) sarebbe simile a questo:

 { "page": 1, …, "countries": [ { "id": "AFG", "name": "Afghanistan", … }, { "id": "BDI", "name": "Burundi", … }, … ] } 

Se si è certi di voler utilizzare JSON (e non XML), è ansible farlo deserializzando prima il JSON nel modello a oggetti di JSON.NET e quindi deserializzando quello nel modello:

 var json = client.DownloadString("http://api.worldbank.org/incomeLevels/LIC/countries?format=json"); var array = (JArray)JsonConvert.DeserializeObject(json); var serializer = new JsonSerializer(); var countryModel = serializer.Deserialize(array[0].CreateReader()); countryModel.Countries = serializer.Deserialize>(array[1].CreateReader()); return countryModel; 

Non dimenticare di modificare le proprietà Id in string , perché è quello che sono.

Il tuo modello non corrisponde alla struttura JSON. Sembra che manchi le ultime 6 proprietà.

 { "id": "AFG", "iso2Code": "AF", "name": "Afghanistan", "region": { "id": "SAS", "value": "South Asia" }, "adminregion": { "id": "SAS", "value": "South Asia" }, "incomeLevel": { "id": "LIC", "value": "Low income" }, "lendingType": { "id": "IDX", "value": "IDA" }, "capitalCity": "Kabul", "longitude": "69.1761", "latitude": "34.5228" 

}