JSON (JavaScript Object Notation)

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: JSON (JavaScript Object Notation)

Message par Fig »

falsam a écrit : PS : Oui je partage et je ne suis pas devant mon miroir en me disant Whaouu suis trop fort !
Ha, quand on a pas le physique... :mrgreen:
Merci quand même de partager, tant pis si tu n'y trouve aucun intérêt pour ton amour propre. :lol:
C'est gâcher un peu, du coup. :mrgreen:

Ca va j'ai compris l’intérêt cette fois !!
C'est pour les faignant et ça me va très bien ! :wink:
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
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: JSON (JavaScript Object Notation)

Message par microdevweb »

Merci Falsam,

Je retravaille ma table personnalisée je vais ajouter l'insertion de record direct dans la table (en tuto d’ailleurs) et je pense inclure une fonction de sauvegarde directe en JSON.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: JSON (JavaScript Object Notation)

Message par majikeyric »

Que représente exactement : "la valeur JSON" que l'on obtient avec JSONValue(#JSON) ?

ça a l'air d'être aussi un identifiant comme #JSON.

Dans la doc, y a quelques erreurs du type :

Code : Tout sélectionner

Arguments
#JSON : La valeur JSON
pour la fonction IsJSON(#JSON) par exemple.
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: JSON (JavaScript Object Notation)

Message par microdevweb »

Première fois que j'utilise json dans le cadres de mon projet, et c'est vraiment de la balle. Quel facilité pour sauvegardé,et rechargé la sauvegarde. Et en plus on donne l’extension de fichier que l'on veux. Vraiment trop bien :lol:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: JSON (JavaScript Object Notation)

Message par Golfy »

Salut Falsam,

J'avais une liste de modules (structure contenant des entiers, des chaines et... une liste de part contenant elle-même des entiers et des chaines).
Je me voyais déjà devoir écrire un foreach imbriqué pour sauvegarder et relire mes modules (un module pouvant avoir entre 1 et 8 parties) 8O

Et là, je trouve ton exemple, bien plus clair que l'exemple officiel fourni !

Tout d'abord un grand merci, car cela donne ceci (en terme de code) :

Code : Tout sélectionner

Procedure   SaveModules(file$)
  If CreateJSON(0)
    InsertJSONList(JSONValue(0), VMBModule())
    SaveJSON(0, file$)
  EndIf
EndProcedure
Procedure   LoadModules(file$)
  If LoadJSON(0, file$)
    ExtractJSONList(JSONValue(0), VMBModule())
    WindowViewModule(1)
    Debug ComposeJSON(0, #PB_JSON_PrettyPrint)
  EndIf
EndProcedure
Impossible d'être plus concis et surtout, c'est PB qui gère la structure (qui est effectivement complexe) :

Code : Tout sélectionner

Structure VMBModuleMain                          ; Module Structure with a list of Module part
  modAdd.a
  modName.s
  modType.i
  modClass.s
  modPartNumber.i
  modLastScanDate.i
  modBuildYear.i
  modBuildWeek.i
  List modPart.VMBModulePart()
EndStructure

Structure VMB
  number.i                                     ; object unique ID
  ad.i                                         ; address (from 1 to 255)
  part.i                                       ; part (each Module has from 1 To 8 parts)
  type.s                                       ; type of module (ie. VMB1RY)
  class.s                                      ; class of module (TEMP, BUTTON, RELAY, BLIND...)
  nom.s
  ActiviteJour.i                               ; Durée d'activité par jour
  Etat.f                                       ; Status (OFF=0, ON or UP=1, BLINK or DOWN=2...) could be Temp value
  DateEtat.i                                   ; Record date when status changed
  EtatPrec.f                                   ; old status (can't be 0 : blind, dim, ...)
  TimSetting.l                                 ; default timer
  group.s                                      ; Group list separated by '|'
  scanned.b                                    ; Discovered but not scanned (boolean or 2 state : 0=discovered, 1=scanned)
EndStructure
Je vote pour que ton exemple soit présent dans la doc officielle de purebasic : JSON et les listes chaînées, c'est l'exemple à mettre en priorité ! Merci, un grand merci !
Je pensais galérer pour faire ces fonctions au moins une demi-journée (entre la compréhension, le codage, les tests, le débogage) et là, 5 mn et ça marche !!!
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: JSON (JavaScript Object Notation)

Message par Marc56 »

Je déterre ce topic pour ajouter un truc car j'ai passé deux jours à me taper la tête contre mon écran avec des objets imbriqués (chargé depuis un fichier) :oops: (suite à mes essais de WebService avec la nouvelle fonction)
Je commence à utiliser le format JSON (mieux vaut tard) mais impossible d'accéder aux objets imbriqués alors que tous les outils de débug indiquaient que la structure était OK :?: :cry: :?
Tous les exemples des forums fonctionnaient et pas mon code :roll: Quid ?

Deux jours après :idea: Relecture attentive de la doc, et j'ai trouvé ça dans les remarques sur LoadJSON()
« JSON est un format de données sensible à la casse. Cependant, dans certaines situations, telles que les structures de désérialisation avec ExtractJSONStructure() ou des commandes similaires, il peut être utile de traiter des objets JSON de façon insensible à la casse. L'option #PB_JSON_NoCase permet de traiter tous les clés des membres de l'objet comme insensible à la casse. »

Mais la casse de mes objets était bonne puisque j'ai tout fait en couper/coller :o

:arrow: Dans le doute, j'ajoute le paramètre #PB_JSON_NoCase
LoadJSON(#JSONFile, "Fichier.json", #PB_JSON_NoCase)
Et là, ça marche :P j'accède bien aux objets imbriqués

Mais le plus curieux est que je ne me sert pas de ExtractJSONStructure(), mais de ExtractJSONList() (car ma structure est une liste)

Cela dit enfin mon code fonctionne 8)
Si ça peut être utile...

:wink:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: JSON (JavaScript Object Notation)

Message par djes »

Tu as essayé d'ouvrir ton fichier json dans un éditeur hexa? Parfois on a des soucis avec les codages ASCII/Unicode/... Peut-être que le décodeur aussi.
En tous cas, merci pour le tuyau, c'est le genre de bug qui est vraiment pénible à trouver.
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: JSON (JavaScript Object Notation)

Message par Marc56 »

djes a écrit :Tu as essayé d'ouvrir ton fichier json dans un éditeur hexa? Parfois on a des soucis avec les codages ASCII/Unicode/... Peut-être que le décodeur aussi.
Oui, je viens de tester divers encodages du fichier JSON

LoadJSON(#Json, Json_File$)

- ANSI : Objets OK mais objets imbriqués vides
- UTF-8 : Objets OK mais objets imbriqués vides
- UTF-8 + BOM : Pas lu

LoadJSON(#Json, Json_File$, #PB_JSON_NoCase)

- ANSI : Objets OK et objets imbriqués OK
- UTF-8 : Objets OK et objets imbriqués OK
- UTF-8 + BOM : Pas lu

Donc il est indifférent à l'ANSI ou UTF-8, par contre il refuse de lire le fichier s'il commence par un BOM
(exemple avec un UTF-8 + BOM en affichant le message d'erreur)
Debug "Erreur: " + JSONErrorMessage() + " (Ligne: " + JSONErrorLine() + " Position: " + JSONErrorPosition() + ")"
:arrow: Erreur: Unexpected character (Ligne: 1 Position: 1) (c'est le BOM)

:?: Ce qui était curieux c'est que les objets étaient bien lus, la structure imbriquée était créée, mais les objets imbriqués étaient vides.

Maintenant, il ne s'agit donc pas d'un bug, il faut juste le savoir, et il suffit d'insérer un ReadStringFormat() avant LoadJSON pour tester le fichier avant lecture.

:wink:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: JSON (JavaScript Object Notation)

Message par djes »

C'est bon à savoir ! Merci pour tes tests
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: JSON (JavaScript Object Notation)

Message par Shadow »

Salut,

Alors avant que je me mette au Json, je trouvais ça difficile à comprendre.
Maintenant j'ai tous capté :D

C'est pas si compliqué que ça en faite, quand tu a compris comment ça marche !
Mais au début tu est complètement perdus !

Voici un exemple simple sans objet Imbriqué !

Code : Tout sélectionner

#MyJson = 1 ; Le numéro du Json, comme pour un Gadjet.

JsonMemoryAdress.i = CreateJSON(#MyJson) ; Création du Json.

If JsonMemoryAdress.i <> 0 ; Si le Json a été créér.
  
  JsonValueMemoryAdress.i = JSONValue(#MyJson) ; Adresse de la valeur du Json (Imaginez un Bloc de données, une Boîte si vous préférez).
  JsonObjectMemoryAdress.i = SetJSONObject(JsonValueMemoryAdress.i) ; Adresse de l'Objet du Json (Imaginez un second Bloc de données, une autre Boîte dans la Boîte si vous préférez).
  
  JsonMember1NameMemoryAdress.i = AddJSONMember(JsonObjectMemoryAdress.i, "Member 1 Name") ; Adresse du Membre 1 de l'Objet du Json (Imaginez encore un autre Bloc de données, une autre Boîte dans la Boîte de la Boîte si vous préférez).
  JsonMember1ValueMemoryAdress.i = SetJSONString(JsonMember1NameMemoryAdress.i, "Member 1 Value") ; Adresse de la Valeur du Membre 1 de l'Objet du Json.
  
  JsonMember2NameMemoryAdress.i = AddJSONMember(JsonObjectMemoryAdress.i, "Member 2 Name") ; Adresse du Membre 2 de l'Objet du Json, l'Objet du Json à maintenant deux Membres (Imaginez deux Boîte si vous préférez).
  JsonMember2ValueMemoryAdress.i = SetJSONString(JsonMember2NameMemoryAdress.i, "Member 2 Value") ; Adresse de la Valeur du Membre 2 de l'Objet du Json.
  
  JsonMember3NameMemoryAdress.i = AddJSONMember(JsonObjectMemoryAdress.i, "Member 3 Name") ; Adresse du Membre 3 de l'Objet du Json, l'Objet du Json à maintenant trois Membres (Imaginez trois Boîte si vous préférez).
  JsonMember3ValueMemoryAdress.i = SetJSONString(JsonMember3NameMemoryAdress.i, "Member 3 Value") ; Adresse de la Valeur du Membre 3 de l'Objet du Json.
  
EndIf

Debug ComposeJSON(#MyJson, #PB_JSON_PrettyPrint) ; Affichage des données du Json au format aérer avec sauts de ligne et espaces supplémentaires pour une meilleure lisibilité.
Sinon une image c'est bien aussi pour comprendre :)
https://drive.google.com/open?id=1j7QL- ... rJC5x36Ab7
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre