3
votes

Comment créer des classes C # pour désérialiser une chaîne JSON qui commence et se termine par des crochets

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


1 commentaires

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


3 Réponses :


2
votes

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.


3 commentaires

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.



0
votes

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()


2 commentaires

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).