Ne peut pas désérialiser tableau JSON dans le type - Json.NET
Je suis en train de désérialiser une des données json dans une classe de modèle mais je suis faute de. Voici ce que je fais:
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<CountryModel>>(result);
return output.First();
}
}
C'est de cette façon que mon modèle ressemble:
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<Country> 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; }
}
Vous pouvez voir le Json je suis ici: http://api.worldbank.org/incomeLevels/LIC/countries?format=json
C'est l'erreur que je reçois:
Ne peut pas désérialiser tableau JSON dans le type 'Mvc4AsyncSample.Modèles.CountryModel'. Ligne 1, position 1.
Qui ne semble pas être une bonne représentation JSON. Il serait peut-être mieux si vous avez utilisé le format XML.
Oui, je le pense. Ils ont mis un seul objet à l'intérieur d'un tableau. Il ne devrait pas être là, je pense. De toute façon possible de se déplacer?
Le XML est beaucoup plus propre, j'irais pour que: api.worldbank.org/incomeLevels/LIC/countries?format=xml
Je pense que, autant que je sache, l'Json.NET la Sérialisation est beaucoup plus rapide que .NET la Sérialisation XML. C'est pourquoi j'insiste sur JSON. Mais je ne suis pas sûr si je suis à 100% correct ici.
Ah je vois, si la vitesse est votre inquiétude, mais vous souhaiterez peut-être consulter d'autres JSON bibliothèques: theburningmonk.com/2011/08/performance-test-json-serializers (ou code.google.com/p/protobuf-net)
Oui, je le pense. Ils ont mis un seul objet à l'intérieur d'un tableau. Il ne devrait pas être là, je pense. De toute façon possible de se déplacer?
Le XML est beaucoup plus propre, j'irais pour que: api.worldbank.org/incomeLevels/LIC/countries?format=xml
Je pense que, autant que je sache, l'Json.NET la Sérialisation est beaucoup plus rapide que .NET la Sérialisation XML. C'est pourquoi j'insiste sur JSON. Mais je ne suis pas sûr si je suis à 100% correct ici.
Ah je vois, si la vitesse est votre inquiétude, mais vous souhaiterez peut-être consulter d'autres JSON bibliothèques: theburningmonk.com/2011/08/performance-test-json-serializers (ou code.google.com/p/protobuf-net)
OriginalL'auteur tugberk | 2012-02-26
Vous devez vous connecter pour publier un commentaire.
Vous devez écrire une coutume
JsonConverter
:Et la balise
CountryModel
avec ce convertisseur (j'ai aussi eu à passer quelquesint
àstring
):Alors vous devriez être en mesure de désérialiser comme ceci:
CountryModel
en utilisantserializer.Deserialize<CountryModel>(reader)
?svick la réponse est mieux si vous avez seulement besoin de lire, le
JsonConverter
n'est nécessaire que si vous devez aller dans les deux sens.J'ai pensé à ça, le problème, c'est que
CountryModel
a l'attribut, de sorte qu'il pénètre dans une boucle infinie, il serait simplifiée si le modèle de l'objet a changé, mais j'essayais de garder à son modèle d'objet.Bon, je ne pense pas à ce sujet.
OriginalL'auteur Paul Tyng
Cela ressemble à une (pas très bon) tentative à la représentation XML en JSON. Le JSON ressemble à ceci:
Alors que raisonnable JSON (qui serait, au demeurant, carte pour votre modèle gentiment) devrait ressembler à ceci:
Si vous êtes sûr que vous voulez utiliser JSON (et non XML), vous pouvez le faire en premier de la désérialisation du JSON en JSON.NET's modèle d'objet puis désérialiser que dans votre modèle:
N'oubliez pas de changer votre
Id
propriétés àstring
, parce que c'est ce qu'ils sont.OriginalL'auteur svick
Votre modèle ne correspond pas à la structure JSON. Il ressemble à votre manque le dernier propriétés 6.
}
OriginalL'auteur ChrisS