Petits retours sur json en TCL
#1
Plus ça va et plus on utilise le json: entre les API qui en retournent, certains fichiers de configuration, ... J'ouvre donc ce sujet pour que l'on puisse faire des retours et des partages sur leur utilisation.

Absence de clé
Il n'est pas rare qu'un json soit de la forme suivante:

Code:
{
   "results":[{"id":0,"data":"les données d'exemple"}, {"id":1,"data":"d'autres données"}]
}
Si on fait un json2dict de ceci, pas de problème, mais il est impossible d'accéder au contenu de results. Ceci est tout simplement dû au fait qu'il s'agit d'une liste. Il faut donc le traiter en tant que tel.
Premier essai:

tcl
set results [::json::json2dict $datas]
foreach {a r} $results {
   putlog "*** $a => $r"
}

Ceci vous donnera:

Code:
*** results => {id 0 data {les données d'exemple}} {id 1 data {d'autres données}}
Comme on le voit, on obtient bien une liste inutilisable en tant que dict

La bonne manière:

tcl
set results [::json::json2dict $datas]
set i 0
foreach r $results {
   set sdict [dict get [lindex [dict get $result] $i]]
   putlog "ID: [dict get $sdict id] => [dict get $sdict data]
   incr i
}

Le résultat sera:

Code:
ID: 0 => les données d'exemple
ID: 1 => d'autres données
zeolia: tchat gratuit, sans inscription ni publicité
Merci de ne pas demander d'aide en MP
Away
  Reply
#2
Salut @CrazyCat,

On dirait bien que tu t'éclates avec le JSON en TCL ! Comme tu l'as si bien dit, le JSON est partout de nos jours, il est devenu le roi des formats de données.

J'ai remarqué dans ton post le souci que tu as rencontré avec l'absence de clé quand tu as tenté d'accéder à une liste JSON en utilisant json2dict. Alors, ton premier essai avec JSON en TCL, comment ça s'est passé ? On dirait que tu as rencontré un mur ! En utilisant json2dict, tu as réussi à convertir le JSON en dict, mais ensuite, c'était un vrai casse-tête pour accéder aux données dans "results". C'est tout simplement parce que "results" est un dict, pas une liste. (json2"dict")

Ensuite, tu t'es lancé dans un deuxième essai, et là, on peut dire que tu as réussi à dompter la bête ! Tu as utilisé lindex et dict get pour accéder aux données de la liste, heu du dict? Mais attends, il y a une petite erreur dans ton code. Tu utilises la variable $result dans ta boucle foreach, mais tu ne l'as pas définie avant. Peut-être voulais-tu utiliser $results ou plutôt $r à la place ?

Regarde, je pense que ton code devrait ressembler à ça :


tcl
set results [::json::json2dict $datas]
set i 0
foreach r $results {
   set sdict [dict get [lindex $r $i]]
   putlog "ID: [dict get $sdict id] => [dict get $sdict data]"
   incr i
}


Maintenant, laisse-moi te donner une petite astuce pour éviter ce genre de problèmes à l'avenir. Au lieu d'utiliser lindex et dict get, pourquoi ne pas essayer dict with ? Cette commande exécute un script Tcl dans lequel la valeur de chaque clé du dictionnaire est mappée à une variable portant le même nom. Ça pourrait simplifier l'accès aux valeurs dans ton dictionnaire.

Voilà comment tu pourrais utiliser dict with dans ton cas :



tcl
set results [::json::json2dict $datas]
foreach result $results {
   dict with result {
      putlog "ID: $id => $data"
   }
}



Avec dict with, tu peux ouvrir le dictionnaire $result et accéder directement aux valeurs des clés id et data comme si elles étaient des variables. Ça te simplifie la vie, non ?

Allez, continue de t'amuser avec le JSON et TCL. Même si c'est un sacré casse-tête parfois, tu fais du bon boulot ! Et n'oublie pas, les erreurs sont juste une façon d'apprendre. Alors, continue de partager tes aventures avec nous, on adore ça !

PS : J'espère que @MenzAgitat ne passera pas par ici. Tu sais, il a tendance à s'énerver quand on utilise des fonctions destinées aux listes sur des strings, ou des fonctions destinées aux listes avec des dictionnaires, et autres mélanges du genre. D'ailleurs, je suis surpris qu'il n'ait pas encore grimpé aux rideaux comme un chat enragé (devrais-je dire comme un chat fou?) en lisant ton (mon?) post. N'est-ce pas, @CrazyCat ? Tu ne voudrais pas le provoquer, n'est-ce pas ? ;)
Retrouvez les dernières modifications de mes scripts TCL (versions Alpha/Bêta) ainsi que d'autres de mes réalisations sur ma page GitHub et les versions stables dans la section scripts de ce site  8-)
  Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)