[A SUIVRE] JSON avec nom de membre contenant un ":"

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

[A SUIVRE] JSON avec nom de membre contenant un ":"

Message par boddhi »

Bonsoir,

Je dois récupérer des données JSON sur internet, lesquelles contiennent des noms de membres avec des ":" sous la forme
"www":"aaaa"
"xxxx:yyyy": "bbbb"
"xxxx:zzzz": "cccc"
Le but est de récupérer ces données dans un arbre mais comment gérer le nom des variables de la structure censée recevoir ces données ?

Code : Tout sélectionner

Structure DonneesJSON
  www.s
  xxxx:yyyy.s ; ➜ ?
  xxxx:zzzz.s ; ➜ ?
EndStructure
Merci pour votre aide.
Dernière modification par boddhi le mer. 31/mai/2023 14:22, modifié 1 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: JSON avec nom de membre contenant un ":"

Message par Ollivier »

Bonjour Boddhi,

0. les structures sont-elles obligatoires ?

0.1.1. Si oui, enlever les caractères 'deux-points' (':')
ex : "aa:bb" devient aabb

0.1.1.1. Si risque de 'collision' des noms
ex : "page0:550" et "page:0550"
Remplacer les 'deux-points' par un 'underscore' ('_')

0.1.1.1.1. Si autres caractères que les 'deux-points', en plus des 'deux-points', dans le JSON, remplacement et suppression impossibles : mise en structure impossible sans déchéance de lisibilité.
Ex : "aaa:bbb" devient "aaa_Abbb"
"aaa,bbb" devient "aaa_Bbbb"
"aaa.bbb" devient "aaa_Cbbb"
etc...

0.1.2. Peut-être une utilisation plus pointue des structures (si uniquement des 'deux-points' dans le JSON)

Code : Tout sélectionner

; "aaa.bbb" devient :
Structure aaa
 bbb.s
EndStructure

Structure json
 aaa.aaa
EnStructure

Define json.json
json\aaa\bbb = "bonjour"
0.2. Si non (structures pas obligatoire), maintien intégral de l'orthographe des noms avec leurs 'deux-points' ou autre, en utilisant les maps :

Code : Tout sélectionner

NewMap json.s()
json("aaa:bbb") = "ccc"
0.2.1. Dans le cas d'usage des maps, attention à la sécurité des données : les chaînes directes du code source restent visibles dans le fichier exécutable final.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: JSON avec nom de membre contenant un ":"

Message par boddhi »

Salut Ollivier,

Merci de t'être penché sur mon cas ! :wink:
Dans l'intervalle, j'ai tenté de trouver une solution alternative en utilisant le jeu d'instructions JSON telles que ExamineJSONMembers(), GetJSONMember(), etc. Et j'en chie :mrgreen:

Car, en réalité, l'arbre JSON que je récupère est plus complexe que l'exemple que j'ai fourni sur mon premier post.
Il s'approche plus de cela :
{
  "resultats" : {
    "recherche:nombreparpage": "xx",
    "recherche:nombretotal": "xxxx",
    "@attributs" : {
      "attribut" : "xxx"
    },
    "donnees" : {
      "donnee" : [
        "info" : [
          {
            "#texte":"xxxx",
            "nombre":xx
          },
          {
            "#texte":"xxxx",
            "nombre":xx
          }
        ],
        "info" : [
          {
            "#texte":"xxxx",
            "nombre":xx
          },
          {
            "#texte":"xxxx",
            "nombre":xx
          }
        ]
      ]
    }
  }
}
où tu constateras qu'il y a même des noms de membres qui commencent par des "@" et des "#". Alors,
Ollivier a écrit :les structures sont-elles obligatoires ?
ben, vu la complexité de l'arborescence (je n'ai pas développé ici la totalité des ramifications), ça me simplifierait le vie si je pouvais la récupérer par le biais d'une structure et de sous-structures imbriquées avec un simple ExtractJSONStructure().

Je n'ai pas encore étudié en détail ton code mais le rapide coup d'oeil que j'ai jeté dessus me laisserait comprendre qu'un membre de type "aaaa:bbbb" pourrait être récupéré avec

Code : Tout sélectionner

Structure YYYY
  bbbb.s
EndStructure
Structure XXXX
  aaaa.YYYY
EndStructure
Ai-je bien compris ?
Je vais tester en tout cas...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: JSON avec nom de membre contenant un ":"

Message par Ollivier »

Oui, tu as bien compris. Cependant :
1) il y a bien une répétition comme j'ai écrit dans mon code. Sinon, ça te fait inventer des nouveaux noms de termes intermédiaires entre branches et sous-branche.
2) Il n'y a pas de commande qui importe un JSON en structure :
2.a) Le JSON c'est de la donnée
2.b) La structure c'est du code compilable et puis compilé.

La bonne nouvelle au problème c'est que le compilateur est puissant et souple : tu peux créer un programme qui considère que du code source pureBasic, c'est aussi de la donnée dans un fichier texte.

Il y a dans l'IDE de quoi automatiser un tel programme que l'on appelle alors un pré-processeur. Ce programme te produirait tes structures en fonction du JSON.

Les caractères '@' et '#' semble être destinés à attribuer une fonction à ton membre décrit (affichage, modification, etc...). Pas très compliqué.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: JSON avec nom de membre contenant un ":"

Message par boddhi »

Salut Ollivier
Ollivier a écrit : Il n'y a pas de commande qui importe un JSON en structure :
Là, je ne comprends pas bien ton propos.
A quoi sert ExtractJSONStructure() si ce n'est à récupérer un JSON dans une variable structurée ?
Jette un coup d'oeil à ce code pour voir comment je l'utilise pour parser des données JSON vers une variable définie à base de structures et de sous-structures.
Ollivier a écrit : Le JSON c'est de la donnée
Ca, je l'ai compris depuis bien longtemps ! :mrgreen: :wink:
Ollivier a écrit : Tu peux créer un programme qui considère que du code source pureBasic, c'est aussi de la donnée dans un fichier texte.
Ca aussi, je l'ai compris depuis bien longtemps ! :mrgreen: :wink:
J'ai créé qq outils qui me permettent, par exemple, de gérer les localisations (au sens linguistique du terme) de certains de mes sources.
Mais peut-être pensais-tu à un autre usage programmatique ?
Ollivier a écrit : Il y a dans l'IDE de quoi automatiser un tel programme que l'on appelle alors un pré-processeur. Ce programme te produirait tes structures en fonction du JSON.
J'avoue ne pas maîtriser l'IDE dans son entièreté ! Au tout début (version PB 3.??), j'utilisais l'IDE native puis je suis passé à JaPBE tant qu'il pouvait supporter PB (c-à-d PB 4) puis repassé à l'IDE native.
Il y a donc très certainement eu un gap de ma part sur l'évolution de ses fonctionnalités. La doc, peu prolixe (en tout cas en français), n'aide pas non plus...
Pourrais-tu me mettre sur la voie ? Je t'en saurais gré :wink:
Ollivier a écrit : Les caractères '@' et '#' semble être destinés à attribuer une fonction à ton membre décrit (affichage, modification, etc...). Pas très compliqué.
Je ne sais pas, je ne crois pas au vu des types de données associés à ces membres mais je me trompe peut-être...
Pas très compliqué ? Si tu as un début d'os à ronger, je suis preneur :wink:

Merci encore pour tes réponses.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: JSON avec nom de membre contenant un ":"

Message par Ollivier »

boddhi a écrit : mar. 23/mai/2023 18:37 Salut Ollivier
Ollivier a écrit : Il n'y a pas de commande qui importe un JSON en structure :
Là, je ne comprends pas bien ton propos.
A quoi sert ExtractJSONStructure() si ce n'est à récupérer un JSON dans une variable structurée ?
A priori ExtractJSONStructure() remplit un tampon mémoire structuré.

Moi, mon propos consiste à obtenir une définition de structure. Je me suis référé à tes exemples et ta suggestion de code en début de sujet.
A priori, tu pars de données JSON qui ont des noms semblant correspondre à des noms de champs de structure.
Puis tu veux obtenir une définition de structure dans ton code source, prête à être compilée en pureBasic.

entrée =
JSON datas
"pif:nom" = "raoul"
"pif:age" = "45"
"pif:sexe" = "si affinité"

sortie =
Définitions de structure

Code : Tout sélectionner

Structure pif
nom.s
age.s
sexe.s
EndStructure
boddhi a écrit : Jette un coup d'oeil à ce code pour voir comment je l'utilise pour parser des données JSON vers une variable définie à base de structures et de sous-structures.
Je n'ai pas regardé pour les sous-structures (sauf si tu insistes parce que je m'égare trop). Mais de ce que j'en lis, tu définis à la main les structures.
boddhi a écrit :
Ollivier a écrit : Le JSON c'est de la donnée
Ca, je l'ai compris depuis bien longtemps ! :mrgreen: :wink:
Ollivier a écrit : Tu peux créer un programme qui considère que du code source pureBasic, c'est aussi de la donnée dans un fichier texte.
Ca aussi, je l'ai compris depuis bien longtemps ! :mrgreen: :wink:
J'ai créé qq outils qui me permettent, par exemple, de gérer les localisations (au sens linguistique du terme) de certains de mes sources.
Mais peut-être pensais-tu à un autre usage programmatique ?
Oui, en fait j'imagine un programme qui définit automatiquement une structure en lisant un fichier JSON. Le programmeur n'aurait plus à étudier le fichier JSON pour définir à la main une structure. On peut dire que c'est une méta-fonctionnalité, un peu comme les constantes pré-enregistrées qui, une fois leurs noms tapés, prennent automatiquement leurs majuscules et minuscules comme ça a été prédéfini préalablement, les structures seraient définies automatiquement à partir d'un fichier JSON, et seraient placées en tête de fichier par l'IDE.
boddhi a écrit :
Ollivier a écrit : Il y a dans l'IDE de quoi automatiser un tel programme que l'on appelle alors un pré-processeur. Ce programme te produirait tes structures en fonction du JSON.
J'avoue ne pas maîtriser l'IDE dans son entièreté ! Au tout début (version PB 3.??), j'utilisais l'IDE native puis je suis passé à JaPBE tant qu'il pouvait supporter PB (c-à-d PB 4) puis repassé à l'IDE native.
Il y a donc très certainement eu un gap de ma part sur l'évolution de ses fonctionnalités. La doc, peu prolixe (en tout cas en français), n'aide pas non plus...
Pourrais-tu me mettre sur la voie ? Je t'en saurais gré :wink:
Alors non, a priori, ça existe depuis le début mais ce n'est pas simplissime.

netmaestro a fait un exemple de programme pre-processing pour définir un process des différentes fonctions natives de la librairie vector drawing en fonction d'un dessin préalablement schématisé à la souris.
boddhi a écrit :
Ollivier a écrit : Les caractères '@' et '#' semble être destinés à attribuer une fonction à ton membre décrit (affichage, modification, etc...). Pas très compliqué.
Je ne sais pas, je ne crois pas au vu des types de données associés à ces membres mais je me trompe peut-être...
Pas très compliqué ? Si tu as un début d'os à ronger, je suis preneur :wink:

Merci encore pour tes réponses.
Je regarderai ça plus tard, mais ce n'est pas le plus compliqué, je pense.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: JSON avec nom de membre contenant un ":"

Message par boddhi »

Salut Ollivier,
Ollivier a écrit :A priori ExtractJSONStructure() remplit un tampon mémoire structuré.
Pardonne-moi Ollivier mais c'est tout l'inverse.
Cette instruction alimente une variable structurée à partir d'une zone mémoire devant avoir reçu préalablement une "structure de données" JSON.
Ollivier a écrit :Moi, mon propos consiste à obtenir [...] une définition de structure dans ton code source, prête à être compilée en pureBasic.
J'ai pas encore eu le temps de tester nos échanges à ce sujet. :oops:
Je jongle entre deux développements et, faute d'avoir pu avancer à un moment donné à cause de cette problématique de structures de données JSON, je me suis déporté sur l'autre et comme les deux demandent du temps d'analyse et de conception, je me concentre actuellement sur celui en cours.
J'espère pouvoir m'y remettre ce WE et ne manquerais de te faire un retour. :wink:
Je te remercie en tout cas pour ton explication sur cette manière particulière d'utiliser les structures. C'est une astuce que je ne connaissais pas et que, par ailleurs, je n'imaginais pas techniquement possible.
Me restera à voir si elle peut fonctionner avec les membres contenant des # et des @.
Mais de ce que j'en lis, tu définis à la main les structures.
Hé oui, car je ne connais pas d'autres moyens. Après, cette façon de faire me semble pratique. Ca me permet d'exclure certaines données que je ne souhaite pas récupérer (les membres JSON n'ayant par leur nom dans la structure ne seront pas récupérés par PB) et, point important, PB fait automatiquement les affectations, tout seul comme un grand. Pour peu que la ou les [sous-]structures soient correctement préalablement définies.
Oui, en fait j'imagine un programme qui définit automatiquement une structure en lisant un fichier JSON
Je vois tu veux en venir. Cette approche est intéressante dès lors que la structure JSON n'est pas connue d'avance.
Pour en revenir à mon cas, moi je la connais et sais qu'elle n'est pas vouée à changer.
Alors non, a priori, ça existe depuis le début mais ce n'est pas simplissime.
netmaestro a fait un exemple de programme pre-processing [...]
Hooouuuuulà, je crois que, là, ça dépasse un peu mes compétences actuelles ! :lol:
Chaque embûche en son temps, je dirais !
Je prends note de l'info en espérant pouvoir m'y plonger un peu plus tard et en tirer qq chose d'intelligible pour mon petit crâne ! :wink:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: JSON avec nom de membre contenant un ":"

Message par Ollivier »

J'insiste sur le sens de ExtractJSONStructure etc...
Ça convertit bien d'une chaîne JSON vers un tampon mémoire structuré.
Et je dirais que le débat du sens de conversion n'a pas d'importance dans ta demande : il existe aussi la fonction réciproque (InsertJSONStructure ).

Aussi, l'aspect automatique semble ne pas te séduire dans tes besoins actuels.

Autrement dit, tes questions gravitent autour des embranchements. Et l'exemple que j'ai donné (un petit peu court) est, il me semble, le bon.

Est-ce qu'il te faut un exemple plus complexe ?
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: JSON avec nom de membre contenant un ":"

Message par boddhi »

Ollivier a écrit : Aussi, l'aspect automatique semble ne pas te séduire dans tes besoins actuels.
Si j'ai bien compris ton approche qui consisterait à déterminer, à la lecture d'une arborescence JSON, un ensemble de variables structurées et à créer un fichier qui serait appelé en import dans un code source alors non, en effet, ça ne me serait pas utile et nécessaire dans l'immédiat même si j'en comprends tout l'intérêt et que pourrais en avoir le besoin pour d'autres développements.
Autrement dit, tes questions gravitent autour des embranchements. Et l'exemple que j'ai donné (un petit peu court) est, il me semble, le bon.
Oui et le simple fait d'apprendre qu'il était possible de "transformer" automatiquement un membre JSON "xxxx:yyyy" en jeu de variables structurées a été une grande révélation ! :lol:
Est-ce qu'il te faut un exemple plus complexe ?
Je ne voudrais pas abuser de ton temps ! Mais je ne te ferais pas un procès si tu venais à m'éclairer sur la manière dont on pourrait gérer des "@" et des "#" dans les noms de membres ! :D :wink:
S'il existe une autre technique que celle de l'analyse, ligne par ligne, desdits membres et qui permet à PB de faire [quasi] automatiquement les affectations, alors effectivement, je serais preneur ! :mrgreen:
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: JSON avec nom de membre contenant un ":"

Message par Marc56 »

Avec JSON, si tu ne connais pas la structure des données à l'avance, c'est très compliqué, il faut filtrer les données lignes par ligne.

Par contre, une fois que les données sont dans une structure, tu peux y accéder par l'intermédiaire de pointeurs et donc les # et @ ne gênent pas, puisque ce sera juste des caractères et pas des identificateurs de variables.

Bon, je n'explique pas bien, je laisse Ollivier le faire plus distinctement (car les pointeurs: j'ai toujours du mal)
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: JSON avec nom de membre contenant un ":"

Message par boddhi »

Code : Tout sélectionner

Structure BBBB
  Donnee1.s
EndStructure
Structure AAAA
  Donnee1.s
  Donnee2.BBBB
  Donnee3.s
  Donnee4.s
EndStructure

#JSON=0
Variable.AAAA

ChaineJSON.s="{"+
             Chr(34)+"Donnee1"+Chr(34)+":"+Chr(34)+"Valeur donnée 1"+Chr(34)+","+
             Chr(34)+"Donnee2:Donnee1"+Chr(34)+":"+Chr(34)+"Valeur donnée 2"+Chr(34)+","+
             Chr(34)+"#Donnee3"+Chr(34)+":"+Chr(34)+"Valeur donnée 3"+Chr(34)+","+
             Chr(34)+"@Donnee4"+Chr(34)+":"+Chr(34)+"Valeur donnée 4"+Chr(34)+
             "}"
If ParseJSON(#JSON,ChaineJSON,#PB_JSON_NoCase)
  Debug ComposeJSON(#JSON,#PB_JSON_PrettyPrint)+Chr(10)
  ExtractJSONStructure(JSONValue(#JSON),@Variable,AAAA)
  With Variable
    Debug "Donnee1 : "+\Donnee1
    Debug "Donnee2 : "+\Donnee2\Donnee1
    Debug "Donnee3 : "+\Donnee3
    Debug "Donnee4 : "+\Donnee4
  EndWith
EndIf
Bon, alors, c'est un peu la douche froide ! :cry:
Ce que je croyais avoir compris ne fonctionne pas...

Affecter un membre JSON de type "XXXX:YYYY":"Valeur" à une variable structurée ainsi

Code : Tout sélectionner

Structure BBBB
  YYYY.s
EndStructure
Structure AAAA
  XXXX.BBBB
EndStructure
ne me donne pas le résultat escompté, à savoir : Variable.AAAA\XXXX\YYYY=Valeur.

:oops:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: JSON avec nom de membre contenant un ":"

Message par Ollivier »

Boddhi a écrit :Bon, alors, c'est un peu la douche froide ! :cry:
Si tu pouvais cesser de jouer avec le mitigeur... Tu vas finir par te brûler... Je regarde ça ce soir...
Marc56 a écrit :Bon, je n'explique pas bien, je laisse Ollivier le faire plus distinctement (car les pointeurs: j'ai toujours du mal)
rôh le mytho... La fausse excuse pour aller se dorer le bedinet au soleil, avant le pastaga-barbecue qui risque de se terminer en orgie avant minuit !
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: JSON avec nom de membre contenant un ":"

Message par boddhi »

Ollivier a écrit :Si tu pouvais cesser de jouer avec le mitigeur
:lol:
Bah, en même temps, l'été approchant, il commence à faire chaud par chez moi.
Et comme je suis bien plus près de l'équateur que du Pôle nord, une douche (pas trop) froide de temps en temps, ça fait du bien ! :D

Sauf quand il s'agit de déception logicielle ! :mrgreen:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: JSON avec nom de membre contenant un ":"

Message par Ollivier »

boddhi a écrit : jeu. 25/mai/2023 11:51 Bon, alors, c'est un peu la douche froide ! :cry:
Ce que je croyais avoir compris ne fonctionne pas...

Affecter un membre JSON de type "XXXX:YYYY":"Valeur" à une variable structurée ainsi

Code : Tout sélectionner

Structure BBBB
  YYYY.s
EndStructure
Structure AAAA
  XXXX.BBBB
EndStructure
ne me donne pas le résultat escompté, à savoir : Variable.AAAA\XXXX\YYYY=Valeur.

:oops:
Alors... Est-ce que, déjà, ça, ça te convient ?

Code : Tout sélectionner

Structure bbbb
 yyyy.s
EndStructure

Structure aaaa
 xxxx.bbbb
EndStructure

v.aaaa\xxxx\yyyy = "hello"

If CreateJSON(0)
 InsertJSONStructure(JSONValue(0), v, aaaa)
 Debug ComposeJSON(0, #PB_JSON_PrettyPrint)
EndIf
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: JSON avec nom de membre contenant un ":"

Message par boddhi »

Euuhh...

Je crois que tu as dû oublier mon souci de départ... qui n'est pas de travailler avec des variables avec structures elles-mêmes composées de sous-structures. Ca, je maîtrise depuis que PB est PB ! :)

Mon problème est comment affecter, à l'aide de ExtractJSONStructure(), une variable structurée à partir d'une arborescence JSON où des membres sont construits ainsi "XXXX:YYYY":"Valeur" ou "#XXXX":"Valeur" alors, qu'en règle générale, on a plutôt affaire à des "XXXX":"Valeur"
Répondre