Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Lire un tableau json avec une clef absente
#1
Bonjour à tous,

j'ai été confronté à un problème pour lire un tableau json avec une clef absente, exemple:


Quote:{
  "items": [
    {
      "snippet": {
        "title": "In The Shade",
        "channelTitle": "Flox - Topic"
      },
      "contentDetails": {
        "duration": "PT4M47S"
      },
      "statistics": {
        "viewCount": "274"
      }
    }
  ]
}


il y a un souci dans les lignes :


Quote:  "items": [

    {




Le dict veut une clé entre [ et { comme il n'en trouve pas, il considère comme chaine les lignes :


Quote:    {
      "snippet": {
        "title": "In The Shade",
        "channelTitle": "Flox - Topic"
      },
      "contentDetails": {
        "duration": "PT4M47S"
      },
      "statistics": {
        "viewCount": "274"
      }
    }


En essayant de récupérer le title avec [dict get $variable items snippet title] il ne trouvera aucune correspondance et [dict keys $variable items] retournera seulement la clef items.

La solution pour contourner le problème sera lors de l'utilisation de la fonction json2dict :


tcl
set data [json2dict [string map {\[ {} \] {}} [http::data $ipq]]]


Vous pourrez ensuite récupérer vos informations avec succès, si on prend l'exemple du titre [dict get $variable items snippet title] retournera In The Shade

En espérant que ça aidera les users qui tomberont dans la même problèmatique.

PS: Merci à CrazyCat pour la solution.
  Reply
#2
Petit nota : le json initial est totalement valide et respectueux de la norme, c'est une lacune du package qui n'ajoute pas d'index automatiquement. Je pense qu'il y a probablement une solution un peu plus élégante pour supprimer les éléments redondants, mais le mieux serait de pouvoir ajouter l'index pour obtenir:

Code:
{
  "items": {
    "0": {
      "snippet": {
        "title": "In The Shade",
        "channelTitle": "Flox - Topic"
      },
      "contentDetails": {
        "duration": "PT4M47S"
      },
      "statistics": {
        "viewCount": "274"
      }
    }
  }
}
La solution actuelle n'est pas applicable globalement, json étant relativement permissif sur cette partie de la syntaxe.

Nota 2: je salue le génie qui a trouvé le souci et l'a solutionné :)
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply
#3
Merci pour le partage :)
  Reply
#4
(14/06/2022, 14:05)Amand Wrote: Bonjour à tous,

j'ai été confronté à un problème pour lire un tableau json avec une clef absente

Tu as essayer de faire set ITEM_DATA {*}[dict get [json::json2dict ${json_data}] items] ?
ensuite genre tu set title [encoding convertfrom [dict get ${ITEMS_DATA} snippet title]]
:)


{*} fait de chaque élément d'une liste un argument individuel de la commande en cours.
Et dans ton cas il faut le mettre a la hauteur de du [dict get ... items] et non a celle de [json2dict ...]
  Reply
#5
Bien que cette solution soit plus élégante, le souci reste quasi le même car il faut identifier à quel moment il n'y a pas de clé pour pouvoir utiliser le {*} à bon escient.
Je n'ai pas regardé comment était fait le package json (et plus particulièrement json2dict) de tcllib, il doit être possible de l'améliorer pour forcer l'ajout des clés quand nécessaire, mais ce sera probablement au détriment des performances. Donc cela impliquera aussi d'ajouter une option pour forcer l'activation de ce mode
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
  Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)