JSON (JavaScript Object Notation)

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

JSON (JavaScript Object Notation)

Message par falsam »

Une des nouveautés de la version 5.30 de Pure Basic est la gestion des fichier JSON (JavaScript Object Notation)

Si vous ne connaissez pas les caractéristiques d'un fichier JSON, cliquez sur ce lien : Présentation de JSON

■ Ce premier tutoriel sous la forme d'un code commenté abordera les points suivants :
- La création d'une chaîne JSON CreateJSON()
- L'insertion d'une liste chaînée dans une chaine JSON InsertJSONList()
- La sauvegarde d'une chaîne JSON dans un fichier SaveJSON()
- Debug de la composition d'une chaine JSON ComposeJSON()

■ Rien de sorcier, nous allons créer une structure et sa liste chaînée associée qui contiendra deux noms. Cette liste chaînée sera ensuite sauvegardée dans un fichier au format JSON.

Code : Tout sélectionner

Enumeration 
  #JSONFile
EndEnumeration

Structure Address 
  Actif.b
  Name.s
  County.i
EndStructure

NewList Contacts.Address()

;Création d'une structure JSON (Nouvelle fonction)
CreateJSON(#JSONFile)

;Trés classique : Ajoutons deux élémement à la liste chainée
AddElement(Contacts())
With Contacts()
  \Actif = #True
  \Name = "Wagner"
  \County = 75
EndWith

AddElement(Contacts())
With Contacts()
  \Actif = #True
  \Name = "Hilton"
  \County = 92
EndWith

;Insertion de la liste chainée dans la chaine JSON (Nouvelle fonction)
InsertJSONList(JSONValue(#JSONFile), Contacts())

;Sauvegarde de la chaine JSON (Nouvelle fonction)
SaveJSON(#JSONFile, "contacts.json")

;Debug de la chaine JSON (Nouvelle fonction)
Debug ComposeJSON(#JSONFile, #PB_JSON_PrettyPrint)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: JSON (JavaScript Object Notation)

Message par falsam »

■ C'est bien beau de sauvegarder une liste dans un fichier JSON ! Mais comment lire ce fichier et l'insérer à nouveau dans une liste chaînée ?

■ C'est l'objet de cette deuxième partie de ce tutoriel, lui aussi sous la forme d'un code commenté qui abordera les points suivants :
- Chargement d'un fichier JSON LoadJSON()
- Extraction de la chaine JSON et ajout de cette chaine dans la liste chainée ExtractJSONList()

Code : Tout sélectionner

Enumeration 
  #JSONFile
EndEnumeration

Structure Address 
  Actif.b
  Name.s
  County.i
EndStructure

NewList Contacts.Address()

;Lecture du fichier JSON (Nouvelle fonction)
LoadJSON(#JSONFile, "contacts.json", #PB_JSON_NoCase)

;Extraction de la chaine JSOn vers la liste chainée Contacts (Nouvelle fonction)
ExtractJSONList(JSONValue(#JSONFile), Contacts())

;Debug de la chaine JSON (Nouvelle fonction)
Debug ComposeJSON(#JSONFile, #PB_JSON_PrettyPrint)

;ou debug plus classique
ForEach Contacts()
  With Contacts()
    Debug \Name + " Country: " + \County
  EndWith
Next
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: JSON (JavaScript Object Notation)

Message par PAPIPP »

Merci Falsam
Voici ma petite contribution sur le chargement et le déchargement d'un tableau à 1 ou 2 dimensions avec les instructions JSON

Code : Tout sélectionner

Macro _q_t_
  "
EndMacro

Macro _n(__n)
  _q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Dim Numbers.l(0)

; This is the magic!
ParseJSON(1, "[2, 4, 6, 8, 10, 12, 0, 1]")
Debug JSONArraySize(JSONValue(1))

ExtractJSONArray(JSONValue(1), Numbers())

For i = 0 To ArraySize(Numbers())
  Debug Numbers(i)
Next i
Debug "c'est fini pour le tableau 1 dimension"
;***********************************************************************************
 ParseJSON(0, "[[0, 1, 2], [3, 4, 5], [6, 7, 8]]")
  
  Dim a(0, 0)
  ExtractJSONArray(JSONValue(0), a())
  
  For x = 0 To 2
    For y = 0 To 2
      Debug _n(a(x, y))+_n(x)+_n(Y)
    Next y
  Next x
  
  Debug "c'est fini pour le tableau à 2 dimensions"
  ;****************************************************************************************
  Debug "Maintenant on fait l'inverse on rempli un espace Json"
  Debug ComposeJSON(0)
  ; Clear de JSONValue(0)
  ClearJSONElements(JSONValue(0))
  Debug ComposeJSON(0)
Debug "il est bien vide"
    If CreateJSON(2)
    InsertJSONArray(JSONValue(2), a())
    Debug ComposeJSON(2)
  EndIf 
  Debug "on a bien retrouvé l'espace JSON  d'origine"
  
On peut ainsi avec quelques instructions sauver un tableau dans un fichier et le récupérer par la suite
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Lemaquis
Messages : 271
Inscription : mer. 25/déc./2013 7:34
Localisation : la corse

Re: JSON (JavaScript Object Notation)

Message par Lemaquis »

merci pour ce tuto
en plus c'est un fomat de fichier utilisé par firefox .
LeMaquis
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: JSON (JavaScript Object Notation)

Message par Fig »

Donc pour résumer, c'est pratique pour sauvegarder et recharger des structures ainsi que pour les initialiser sans utiliser une boucle de data.
Ainsi que pour échanger des données entre différents langages.
J'ai bon ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: JSON (JavaScript Object Notation)

Message par Backup »

franchement, je vois pas trop l'interet... mais bon ..

on peut déjà faire tout ça , avec un fichier standard ...
voir avec les "Préférences" , si on veux un truc legerement hiérarchisé ...

deja le XML , c'est le truc a la mode, je trouve ça plutôt lourdingue ... mais bon ...
on creer des formats nouveaux , qui font mode ....

pour moi , c'est un peu pisser dans un violon .. (faudra que j'essaie ça un jour ... depuis le temps que j'en entends parler )
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: JSON (JavaScript Object Notation)

Message par falsam »

@Dobro : Je préfére stocker et sauvegarder une liste chainée de cette façon

Code : Tout sélectionner

InsertJSONList(JSONValue(#JSONFile), MaListeChaine())
SaveJSON(#JSONFile, "MaListeChaine.json")
plutot que de me coder une procédure ou une routine 100 fois plus longue et pas normalisé.

Les fichier XML ou JSON ne sont pas un phénomène de mode. Ces fichiers existe depuis plus de 10 ans et sont normalisés.

55 langages sont capables d'interpréter les fichiers JSON en natif : C++, C#, Java, JavaScript, Perl, Python, Php ...... et maintenant Pure Basic.

:arrow: Le site : json.org
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: JSON (JavaScript Object Notation)

Message par nico »

Donc pour résumer, c'est pratique pour sauvegarder et recharger des structures ainsi que pour les initialiser sans utiliser une boucle de data.
Ainsi que pour échanger des données entre différents langages.
J'ai bon ?
J'ai commencé a découvrir le format Json dans les requêtes web, le XML plus ancien semble mieux adapté à l'échange des données dans certains cas, tu peux par exemple créer un fichier xml qui sera lu par excel, ce qui est plutôt intéressant.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: JSON (JavaScript Object Notation)

Message par falsam »

Fig a écrit :Donc pour résumer, c'est pratique pour sauvegarder et recharger des structures ainsi que pour les initialiser sans utiliser une boucle de data.
Ainsi que pour échanger des données entre différents langages.
J'ai bon ?
Tu as bon :) Les fichiers étant normaliser, une cinquantaine de langages sont capables de manipuler nativement les fichiers JSON comme Pure Basic bien sur mais aussi pour citer les principaux : JavaScript, Php, C, C++, C#, Python, Visual Basic, Ruby.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: JSON (JavaScript Object Notation)

Message par Fig »

nico a écrit : J'ai commencé a découvrir le format Json dans les requêtes web, le XML plus ancien semble mieux adapté à l'échange des données dans certains cas, tu peux par exemple créer un fichier xml qui sera lu par excel, ce qui est plutôt intéressant.
Pour excel, j'ai l'habitude d'utiliser des fichier CSV (+chr13 et ";"), qu'est ce qui change en xml ? on peut gérer la mise en page, les couleurs ... ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: JSON (JavaScript Object Notation)

Message par nico »

Le CSV, oui c'est très simple mais c'est chiant à l'ouverture quand il faut se taper tout les redimensionnement des colonnes quand ça va pas, avec un peu de XML tu peux ajuster les colonnes, les couleurs et tout un tas de truc; après ça va dépendre de tes données.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: JSON (JavaScript Object Notation)

Message par Backup »

falsam a écrit :@Dobro : Je préfére stocker et sauvegarder une liste chainée de cette façon

Code : Tout sélectionner

InsertJSONList(JSONValue(#JSONFile), MaListeChaine())
SaveJSON(#JSONFile, "MaListeChaine.json")
plutot que de me coder une procédure ou une routine 100 fois plus longue et pas normalisé.
heu , quoique tu fasses, l'appel de la routine se fait pour l'utilisateur en 2 instructions
mais derrière la boucle de lecture, existe bel et bien !
il faut forcement une boucle pour "parser" le contenu du fichier /structure/liste ....

que je sache les données écrites ne sont pas compressées ...

donc niveau vitesse , (si par "plus longue" tu entends vitesse) utiliser une boucle de chargement/sauvegarde complète de ton fichier ,
doit allez aussi vite que les fonctions JSON , je supposes, que c'est surtout l'appel qui est simplifié ...


pour ce qui est de la vitesse , je demande a voir ....
c'est la vitesse du disque dur, qui bloque .. c'est tout

les fonctions JSON, diminue la taille du code ...
mais rien n’empêche de coder ta routine de chargement/sauvegarde en librairie ,
et ainsi disposer de 2 fonctions de chargement/sauvegarde ... dans le format qui est le tiens ....

le fait de dire que tout les langages utilisent Json , n'est pas forcement gage de qualité
j'aurai préféré des fonctions sur les Strings (comme en PHP) , des fonctions sur la gestions de la souris/joystick (sans avoir a faire appel au API)
j'aurai préféré des Variables flottantes dans les Boucles For Next step., des Sprites Flipables , une amélioration du WebGadget .etc ...etc ....
beaucoup plus utiles dans le quotidien de petit programmeurs du dimanche ..

mais bon :)

c'est bien Purebasic n'est pas mort, on va pas se plaindre
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: JSON (JavaScript Object Notation)

Message par graph100 »

C'est quand même vachement pratique !
Parce que le JSON est devenu très utilisé dans le cas d'appel à des API Web.

J'en ai eu besoin il y a 4 mois, Pb ne prenant pas encore en charge ce truc, j'ai du chercher comment m'en sortir, et je te garantie que gérer le format complet JSON à la main, ca n'est pas un cadeau, même si ça reste simple en comparaison d'autres formats.

Purebasic est un basic très puissant, mais c'est un basic et ce genre de commande ajoutée est ce qui défini un basic.
De plus avec l'ajout de SpiderBasic qui touche au web / javascript etc.. Ca me parait évident que cet ajout découle de là.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: JSON (JavaScript Object Notation)

Message par Fig »

Comment ça marche pour sauvegarder des structures imbriquées ?
Genre:

Code : Tout sélectionner

Structure carte
objet.i
Endstructure
Structure truc
list bidule.i()
map Carte.carte()
EndStructure
newlist Liste.truc()
Quelqu'un peut donner un exemple ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: JSON (JavaScript Object Notation)

Message par falsam »

Fig a écrit :Comment ça marche pour sauvegarder des structures imbriquées ?
Exactement comme une liste classique dans ce cas.

■ Création d'une chaine JSON
■ Insertion de la liste chainée dans la chaine JSON
■ Sauvegarde de la chaine JSON

Ça tient en 3 lignes.

Code : Tout sélectionner

Enumeration
  #JSONFile
EndEnumeration

Structure carte
  objet.i
EndStructure

Structure truc
  List bidule.i()
  Map Carte.carte()
EndStructure

NewList Liste.truc()

AddElement(Liste())

With Liste()
  AddElement(\bidule())
  \bidule() = 10
  
  AddMapElement(\Carte(), "cle 1")
  \carte()\objet = 20
EndWith


;Création d'une structure JSON (Nouvelle fonction)
CreateJSON(#JSONFile)

;Insertion de la liste chainée dans la chaine JSON (Nouvelle fonction)
InsertJSONList(JSONValue(#JSONFile), Liste())

;Sauvegarde de la chaine JSON (Nouvelle fonction)
SaveJSON(#JSONFile, "liste.json")

;Debug de la chaine JSON (Nouvelle fonction)
Debug ComposeJSON(#JSONFile, #PB_JSON_PrettyPrint)
■ Le code de chargement des données de la liste chaînée imbriquée est lui aussi le même.

Code : Tout sélectionner

Enumeration 
  #JSONFile
EndEnumeration

Structure carte
  objet.i
EndStructure

Structure truc
  List bidule.i()
  Map Carte.carte()
EndStructure

NewList Liste.truc()

;Lecture du fichier JSON (Nouvelle fonction)
LoadJSON(#JSONFile, "liste.json", #PB_JSON_NoCase)

;Extraction de la chaine JSOn vers la liste chainée Contacts (Nouvelle fonction)
ExtractJSONList(JSONValue(#JSONFile), Liste())

;Debug de la chaine JSON (Nouvelle fonction)
Debug ComposeJSON(#JSONFile, #PB_JSON_PrettyPrint)

;ou Debug plus classique
Debug #CRLF$ + "=Liste imbriquée"
ForEach Liste()
  With Liste()
    ForEach(\bidule())
      Debug \bidule()
    Next
    
    ForEach(\Carte())
      Debug \Carte()\objet
    Next
  EndWith
Next
PS : Oui je partage et je ne suis pas devant mon miroir en me disant Whaouu suis trop fort !
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre