Je reçois une chaîne JSON d'une API et je souhaite la désérialiser en objets C # mais je ne parviens pas à obtenir les classes correctes.
J'ai essayé de créer les classes en utilisant http://json2csharp.com/ mais il ne peut pas analyser le JSON, cependant https://jsonlint.com/ indique que le JSON est valide.
J'ai également essayé d'exécuter JsonClassGeneratorLib mais cela dit
Impossible de convertir un objet de type Newtonsoft.Json.Linq.JValue en Newtonsoft.Json.Linq.JObject
Cela semble être un problème car le JSON est entre crochets []
. Je crois que c'est valide mais en fait un tableau. Je pense que j'ai besoin d'un tableau quelque part dans ma classe.
string Json = @"[""error"",{""code"":2,""msg"":""This API Key is invalid""}]"; var obj = JsonConvert.DeserializeObject<RootObject>(Json); public class CodeMsg { [JsonProperty("code")] public long Code { get; set; } [JsonProperty("msg")] public string Msg { get; set; } } public class Result { [JsonProperty("error")] public string String { get; set; } public CodeMsg cm { get; set; } } public class RootObject { public Result Result { get; set; } }
J'obtiens toujours l'erreur
Impossible de désérialiser le tableau JSON actuel (par exemple [1,2,3]) dans le type 'ConsoleApp1.RootObject' car le type nécessite un objet JSON (par exemple {"name": "value"}) pour désérialiser correctement. Pour corriger cette erreur, changez le JSON en un objet JSON (par exemple {"name": "value"}) ou changez le type désérialisé en un tableau ou un type qui implémente une interface de collection (par exemple ICollection, IList) comme
Liste
qui peut être désérialisé à partir d'un tableau JSON
3 Réponses :
Essayez ceci:
var obj = JsonConvert.DeserializeObject<List<Result>>(Json);
Explication: Si le JSON est un tableau, le C # RootObject doit dériver de List / IEnumerable lui-même, ou vous le désérialisez en un List / Array de le Type.
Vous pouvez vider votre classe RootObject
. Si vous voulez utiliser le type RootObject
, faites-le dériver de List. Mais cela ne vaut pas la peine.
Cela me donne alors cette erreur lors de la conversion de la valeur "erreur" en type "ConsoleApp1.Result". Chemin «[0]», ligne 1, position 8.
Pouvez-vous mettre votre type Result
entre crochets pour qu'il soit interprété comme un objet cohérent? @ "[{" "error" ", {" "code" ": 2," "msg" ":" "Cette clé API n'est pas valide" "}}]";
Je viens de réaliser que ce que vous exprimez est un type ou (je pense que vous pouvez l'appeler union discriminée): c'est soit la chaîne "error", soit l'objet "CodeMsg". Vous ne pouvez pas vraiment exprimer cela en C #. D'où ma recommandation avec la syntaxe de l'objet.
Assurez-vous simplement que votre chaîne json doit avoir les mêmes propriétés que la classe JsonHolder.
dynamic obj= new JsonConver.DeserializeObject<List<JsonHolder>>(StrJson);
Vous pouvez également convertir une chaîne json en objet c # en tant qu'objet dynamique. Assurez-vous simplement que votre chaîne json doit avoir les mêmes propriétés que la classe JsonHolder.
public class JsonHolder { public string Id {get;set;} public string Name {get;set;} public string Gender {get;set;} } var jsonHolderList = new JsonConvert.DeserializeObject<List<JsonHolder>>(jsonString); var jsonHolder = jsonHolderList.Single()
Assurez-vous simplement que votre chaîne json doit avoir les mêmes propriétés que la classe JsonHolder.
Les réponses basées uniquement sur le code sont considérées comme de mauvaise qualité: assurez-vous de fournir une explication de ce que fait votre code et de la manière dont il résout le problème. J'ai déplacé votre commentaire dans le corps - veuillez supprimer votre commentaire (je ne peux pas).
Votre JSON est un tableau hétérogène contenant une chaîne et un objet. Cela ne désérialisera pas proprement dans une structure de classe fortement typée sans un peu d'aide. Une solution possible consiste à utiliser un Ensuite, associez le convertisseur à votre classe Enfin, désérialisez le JSON dans la classe Démo de travail: https://dotnetfiddle.net/RLpm5W JsonConverter
a> comme ceci: var result = JsonConvert.DeserializeObject<Result>(Json);
Result
avec un attribut [JsonConverter]
comme celui-ci: p > [JsonConverter(typeof(ResultConverter))]
public class Result
{
public string String { get; set; }
public CodeMsg cm { get; set; }
}
Result
comme ceci: public class ResultConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Result);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray array = JArray.Load(reader);
Result result = new Result
{
String = array[0].Value<string>(),
cm = array[1].ToObject<CodeMsg>(serializer)
};
return result;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Remarque: vous pouvez supprimer le Classe RootObject
; ce n'est pas nécessaire ici.
Impossible de faire mieux que de citer le message d'erreur:
changez le type désérialisé en un tableau ou un type qui implémente une interface de collection