Forums - La Blocothèque - Créer et manipuler des listes avec fromJson

Mots-clés : 

  • Anonyme  | Posté le 30 octobre 2019 à 11 h 36 min

    Bonjour à tous,
    manipuler des listes de nombres peut être intéressant :
    par exemple
    liste1<-createList()
    liste1<-fromJson(“[3,2,1]”)
    permet de créer une liste de 3 nombres que l’on peut interroger avec get().

    Mais cette syntaxe ne fonctionne pas avec des mots.

    Quelqu’un aurait-il la solution pour créer des listes de plusieurs mots et interroger cette liste ensuite ?

    Belle journée.
    JL

    Yannick Audéoud  | Posté le 30 octobre 2019 à 17 h 02 min

    Bonjour,

    Méthode alternative au JSON
    Vous tentez ici d’écrire un texte au format JSON définissant une liste de textes, de manière à le convertir ensuite en une liste.

    Avez-vous une raison particulière de vouloir faire cela, ou est-ce que votre but réel est juste de créer une liste qui contient des textes, quelle que soit la méthode utilisée ?

    En effet, le format JSON est censé servir principalement lors d’échanges avec des services qui imposent l’utilisation de ce format. Cela peut être le cas lors par exemple lors de l’utilisation d’un bloc Requête Web pour dialoguer avec un service web tiers. La réponse de la requête pourra être au format JSON, et la fonction fromJson sera donc très utile pour exploiter cette réponse dans VTS Editor avec les variables.

    Si votre but est uniquement de créer une liste qui contient des textes, voici une méthode plus simple et plus lisible :
    variables

    La fonction add ajoute une valeur à la fin d’une liste, et ne retourne aucun résultat.

    Précision : pour obtenir des lignes comme les 3 dernières, avec uniquement un champ texte, il faut cliquer sur la petite flèche entre les deux champ texte. Ce n’est pas obligatoire, mais cela rend la ligne plus claire, car en effet la fonction add fait partie des fonctions qui ne retournent aucun résultat, et donc qui ne permettent pas de donner une valeur à une variable.

    Ici, on a donc créé une liste qui contient 3 textes : Paris, Berlin et Tokyo.

    Réponse à votre question initiale
    Je réponds dans cette section au cas où vous souhaiteriez malgré tout utiliser la méthode fromJson pour créer votre liste (quelle que soit la raison).

    Vous êtes ici face à un cas assez subtil. En effet :
    – Tous les textes dans les variables doivent être entourés de guillemets, qui marquent donc le début et la fin du texte.
    – Un texte au format JSON est lui-même un texte, entouré par des guillements.
    – Pour créer une liste JSON contenant des textes, on a donc des textes inclus dans des textes.

    On pourrait songer à inclure un texte dans un texte de la manière suivante :
    variables
    Sauf qu’en réalité, le 2e guillemet est reconnu comme étant le marqueur de fin du texte « Un  » (incluant un espace), et non pas comme le début du texte « texte » inclu dans le premier texte. Cela fait donc une erreur.

    Il existe une solution : pour inclure des guillemets dans un texte, pas en tant que marqueur de fin du texte, mais comme faisant partie du texte en lui-même, il faut ajouter un antislash (\) devant le guillemet, comme ceci :
    variable

    Ainsi, on peut donc remplir une liste JSON avec des textes comme ceci :
    variables

    Voici ce que ça donne si j’affiche cette liste dans un bloc Message en faisant {liste} dans le contenu du bloc :
    message

    J’obtiens donc bien une liste contenant des textes.

    Une dernière remarque
    La fonction fromJson créé une nouvelle liste, donc la première ligne de votre exemple (createList) n’est pas utile car elle créé une liste qui est remplacée juste après par le fromJson.

    Cordialement,
    Yannick

    Anonyme  | Posté le 4 novembre 2019 à 13 h 40 min

    Bonjour Yannick, et merci beaucoup : c’est très clair et mis en application avec succès !

    Je passe par Json parce que je que travaille sur des listes qui définissent les énoncés d’un exercice et que chacune est un peu longue pour être rentrée à la main (plus de 150 éléments par liste). J’établis ces listes par une macro xls, je colle le résultat dans une fonction Json (un seul copier/coller par énoncé, et c’est tout). En revanche, les éléments de ces listes permettent ensuite de créer d’autres listes dans VTS Editor, ce qui est automatisé par add ou set, et qui déterminent les paramètres (largeurs, hauteurs, positions verticales et horizontales, couleur avant et après clic, etc.) d’autant de zones cliquables qu’il y a d’éléments dans la liste. Grâce à vos explications, cela marche super-bien et le résultat est très satisfaisant et fluide, avec 5 mn de paramétrage pour un énoncé qui gère plus de 150 zones cliquables, 1 heure pour 12 énoncés !
    Encore merci et bonne journée.
    JL

    Anonyme  | Posté le 30 juillet 2022 à 11 h 12 min

    Hi Yannick, is it possible to use a variable inside a list or a dictionary to define the text and the value?

    For example:
    variable < « temperature,33 »
    dictionary < createDictionary()
    set(dictionary, variable)

    Thanks for your help

    Best Regards,

    Andres

    Yannick Audéoud  | Posté le 1 août 2022 à 9 h 15 min

    Hi,

    A dictionary is already a collection of pairs of values: it is a set of unique keys, and to each key is associated a value.
    The set(dictionary a, text b, value c) function that you give an example of needs 3 parameters. You can find its description nd examples here in the documentation.

    In your case, you may want to associate the key "temperature" with the value 33, so you will write:
    set(dictionary, "temperature", 33)

    Anonyme  | Posté le 1 août 2022 à 11 h 15 min

    Thanks Yannick for your response, what I was trying to achieve is upload a collection of pairs of values at once to a dictionary without having to enter one by one, I try the following using variables but still have to enter the values one by one:

    variableTemp < « temperature »
    variableValue < 33
    dictionary < createDictionary()
    set(dictionary,variableTemp,variableValue)
    message < temperature

    Result in message block is 33.

    Best Regards,

    Andres

    Yannick Audéoud  | Posté le 1 août 2022 à 14 h 20 min

    Maybe I don’t understand what exactly is your situation, but you should be able to write set(dictionary, "temperature", 33) in one line. You will then have one line for each pair (key+value).