[C#]Parser du json en c#, avec une contrainte

Répondre
Partager Rechercher
Bonjour ici!
J'ai un petit soucis avec un fichier JSon que je dois parser. J'utilise la méthode JSonConvert.deserializeObject() de NewtonSoft et voila mon soucis : dans le fichier JSon, une variable qui est normalement un tableau devient une variable quand il n'y a qu'une seule valeur dans le tableau.
Exemple :
toto : [{v1}, {v2}] => valeur de toto quand il y a 2 valeurs
toto : {v1} => valeur de toto quand il n'y a qu'une seule valeur (au lieu de toto : [{v1}])
Du coup ça pose un problème au moment de désérializer car le programme espère trouver un tableau et il trouve une valeur.
Y a-t-il une façon de régler ça?
Merci d'avance!
Citation :
Publié par Bjorn
C'est quoi derrière, c'est du .NET ?
Si oui essaie de changer de bibliothèque, tu peux utiliser celle du .NET directement, j'ai jamais rencontré de soucis avec
https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx
Yes c'est du .net. Tu es sûr que la biblio .net gère le fait que parfois il y a des tableaux et parfois des variables seules?
Non pas du tout Je proposais d'essayer, voir le comportement.

Mais si c'est ton JSON qui est foireux, et que t'as pas la main sur le générateur, l'autre solution me parait d'être forcément un test des deux cas : je suppose qu'une exception est levée quand il trouve une valeur à la place d'un tableau, ben, catche l'exception et présente lui un schéma attendu avec une valeur. Puis tu refous cette valeur dans un tableau que tu crées toi meme a posteriori.
Une verrue si t'as pas la main sur l'origine du problème, en fait :/
Ouaip non j'ai pas vraiment la main dessus en effet x)

Ben le truc c'est que je récupère mes classes en une seule fonction (JsonConverter.deserialize<Type>(String json)), et que je ne vois pas comment modifier la fonction pour renvoyer tel objet en fonction de tel cas!
Ben tu crées deux <Type> différents non ?

Un genre de (meme si ia surement mieux) :

TypeAvecTableau resultatFinal;

try{
resultatFinal = JsonConverter.deserialize<TypeAvecTableau>(json)
}
catch (ExceptionQuiVaBienJ'attendaisUnTableauJ'aiEuUneVal) {

TypeAvecValeurUnique resultatTemp = JsonConverter.deserialize<TypeAvecValeurUnique>(json);
resultatFinal = new TypeAvecTableau(resultatTemp);
}

En faisant ta conversion avec un constructeur que t'implémentes toi meme de ton type final si tu peux, ou en faisant un converter, un truc du genre...


Edit : je viens de penser que ceci ne marche que si tu as un seul champ foireux, un seul champ qui peut être tableau et qui mal écrit en JSON si t'as qu'une valeur.
Si tu sais pas à l'avance quel champ risque d'etre foireux parce que t'as 50 tableaux, ca marche pas... :/

Si c'est le cas, ben, essaie de voir si un autre parser Json passerait outre la malformation json initiale, on sait jamais...
Ou alors, faudra ptet plonger dans le camboui et parser toi meme (en partie) ton JSON je pense :X
Citation :
Publié par Bjorn

Edit : je viens de penser que ceci ne marche que si tu as un seul champ foireux, un seul champ qui peut être tableau et qui mal écrit en JSON si t'as qu'une valeur.
Si tu sais pas à l'avance quel champ risque d'etre foireux parce que t'as 50 tableaux, ca marche pas... :/

Si c'est le cas, ben, essaie de voir si un autre parser Json passerait outre la malformation json initiale, on sait jamais...
Ou alors, faudra ptet plonger dans le camboui et parser toi meme (en partie) ton JSON je pense :X
En fait le problème vient du fait que c'est une valeur qui est dans un sous objet qui peut être un array ou pas.
du coup je peux pas faire de try_catch parce que dans le fichier json que je récupère, il y a parfois des array et parfois des valeurs pour les mêmes objets. J'ai contourné en bidouillant mais c'est dégueulasse :d
Pour tout dire voila ce que j'ai fait :
-considérer que l'objet que j'ai est de type object (comme ça tableau et variable peut rentrer dedans)
-boucler sur les objets obtenus et tester si c'est un JObject ou un JArray
-les caster en faisant jsonconvert.deserializeobject<list<type>> ou jsonconvert.deserializeobject<type> en fonction de ce que c'est, puis les ajouter en liste. Puis caster dans le reste du code.
C'est dégueu mais ça marche.

Dernière modification par Deuterium ; 21/01/2016 à 14h22.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés