Page 2 sur 3

Re: SimplyJson

Publié : lun. 23/mars/2020 13:51
par Shadow
Une personne Novice qui veux apprendre le Json ne serait-ce que par curiosité va s'y cassé les dents.
Bon Alors c'est quoi le Json, comment ça marche concrètement ?, que peut on faire avec ?

Ok, le Json est un format de données (JavaScript Object Notation) permettant de hiérarchiser ces données, plus
simplement, si l'on peut dire grâce à ce format de données, mais faut-il encore savoir l'utiliser pour cela !

Commençons, commençons par ouvrir l'aide de PB et prendre l'exemple de la doc, imbuvable pour un
débutant, car il n'a aucune approche vis à vis de ce nouveau format de données tous simplement.

Bon, ensuite commençons avec:
Resultat = CreateJSON(#JSON) >>> Renvoie une valeur non nulle si la collection JSON a été créée, zéro sinon.

Mais cette « Valeur » c'est quoi ?, rien n'est spécifier à ce sujet dans la doc.
Quand ont test avec le debugueur, ont obtient une valeur étrange du style: 15698524
Donc ont va se contenter d'un: If CreateJSON(#JSON)

Nous savons que #JSON est le numéro du Json, comme pour un Gadget, ici pas de soucis.
Mais le résultat nous restera inconnue pour le moment, nous y viendront plus tard.

Ok, commençons avec: If CreateJSON(1)
Le Json est créé, et ensuite ?

« A la création, les données contiennent une valeur JSON de type #PB_JSON_Null.
La fonction JSONValue() peut être utilisée pour changer ce type. »

Ici ont est troublé, ont comprend que le Json ne contient rien.
Puis, JSONValue(), qu'est ce que c'est que ça ?
Changer sont type ?

JSONValue() = « Renvoie la valeur des données #JSON spécifiés. »
Ici encore perdus, encore une « Valeur » ?

« Valeur de retour
La valeur JSON.
Le résultat n'est jamais nul pour un ensemble de données #JSON valides. »
Bon, ici ont passera, pour y revenir plus tard, « Valeur » trop de « Valeur » à n'y rien comprendre...
Poursuivons,

ObjetPersonne = SetJSONObject(JSONValue(0))

Qu'est ce que c'est que ce charabia ?
ObjetPersonne c'est quoi ?

SetJSONObject() = « Change le type de la valeur JSON en #PB_JSON_Object...»

Valeur de retour
Renvoie la valeur objet ou zéro sinon.
Encore une « Valeur » ?

Mais au faite, c'est quoi ses « Valeur » ???
Quand ont débogue les résultat nous avons encore ses nombre étrange du style: 1154631

Quand au reste, nous perdront le débutant, qui pourra éventuellement lâcher l'affaire.
L'aide de PB n'as pas vocation à être un Tuto pour les Débutant, trop flou par moment...

Code : Tout sélectionner

If CreateJSON(0)
    ValeurObjet = SetJSONObject(JSONValue(0))
    SetJSONInteger(AddJSONMember(ValeurObjet, "x"), 10)
    SetJSONInteger(AddJSONMember(ValeurObjet, "y"), 20)
    SetJSONInteger(AddJSONMember(ValeurObjet, "z"), 30)

    Debug ComposeJSON(0, #PB_JSON_PrettyPrint)
  EndIf
  
  ; Resultat : {
  ;              "x": 10,
  ;              "y": 20,
  ;              "z": 30
  ;            }
Sinon il va essayer de comprendre et de « bidouillé »
Mais au premier abord il ne comprends pas se qu'est: Resultat = CreateJSON(#JSON)

« Resultat » c'est quoi ?, un numéro d'identification ?
Ah non, le numéro d'identification c'est le #Json, ok mais alors ?

Bha ont ne sais pas, (En faite c'est un nombre, un emplacement dans la mémoire.)
Ok et concrètement ça sert a quoi ?
Pas grand chose pour le moment, mais c'est bon à savoir tout de même !

Les « Valeur » sont des numéro d'emplacement dans la mémoire, avec un peu de connaissance, ont fini par le comprendre.
Oui bon et alors ça nous avance à quoi ?

Et puis ses enchevêtrement de commande du style: SetJSONInteger(AddJSONMember(ValeurObjet, "x"), 10)
Bha bha bha, qu'est ce que c'est que ça encore ?!

AddJSONMember() = "Renvoie l'adresse du membre ajouté."

Ah, ici c'est pas une "Valeur" mais une adresse !
Bon "Valeur" ou Adresse ?

En faite c'est "Adresse" mais "Adresse" vers un emplacement mémoire qui lui contient la "Valeur" !
Le débutant va bien s'amuser quand il va vouloir essayer de créer des données imbriqué !

Tenez, demandez à un débutant de faire ceci:

Code : Tout sélectionner

{
  "Jardin" : null,
  "Famille": {
      "Liens"  : {
          "Luck - Alice": 88,
          "Alice - Luck": 85
        },
      "Membres": {
          "Enfants": null,
          "Parents": {
              "Alice": null,
              "Luck" : null
            }
        }
    },
  "Maison" : null
}
Il n'y arrivera peut être pas !
Voici la méthode:

Code : Tout sélectionner

If CreateJSON(0)
  
  MyJson.i = SetJSONObject(JSONValue(0))
    
    Famille.i = AddJSONMember(MyJson.i, "Famille")
    
      FamilleObjet.i = SetJSONObject(Famille.i)
      Membres.i = AddJSONMember(FamilleObjet.i, "Membres")
      
        MembresObjet.i = SetJSONObject(Membres.i)
        Parents.i = AddJSONMember(MembresObjet.i, "Parents")
          
          ParentsObjet.i = SetJSONObject(Parents.i)
          Papa.i = AddJSONMember(ParentsObjet.i, "Luck")
          Maman.i = AddJSONMember(ParentsObjet.i, "Alice")
            
        Enfants.i = AddJSONMember(MembresObjet.i, "Enfants")
        
      MembresLiens.i = AddJSONMember(FamilleObjet.i, "Liens")
      MembresLiensObjet.i = SetJSONObject(MembresLiens.i)
        
          LiensLuckAlice.i = AddJSONMember(MembresLiensObjet.i, "Luck - Alice")
          ValeurLiensLuckAlice.i = SetJSONInteger(LiensLuckAlice.i, 88)
          
          LiensAliceLuck.i = AddJSONMember(MembresLiensObjet.i, "Alice - Luck")
          ValeurLiensAliceLuck.i = SetJSONInteger(LiensAliceLuck.i, 85)
          
    Maison.i = AddJSONMember(MyJson.i, "Maison")
    Jardin.i = AddJSONMember(MyJson.i, "Jardin")
    
  Debug ComposeJSON(0, #PB_JSON_PrettyPrint)
  
EndIf
C'est un bien gros chantier, tous ça pour ça ?
Et il n'y a pas grand chose ici !

Avec toute cette cacophonies, j'ai décider de rendre ça beaucoup plus simple.
Voici un exemple:

Code : Tout sélectionner

CreateSJson(1)

CreateSJsonPatch(1, "Jardin")
CreateSJsonPatch(1, "Famille\Liens\Luck - Alice")
CreateSJsonPatch(1, "Famille\Liens\Alice - Luck")
CreateSJsonPatch(1, "Famille\Membres\Parent\Alice")
CreateSJsonPatch(1, "Famille\Membres\Parent\Luck")
CreateSJsonPatch(1, "Famille\Membres\Parent\Enfants")
CreateSJsonPatch(1, "Maison")

SetSJsonPatchString(1, "Famille\Liens\Luck - Alice", "88")
SetSJsonPatchString(1, "Famille\Liens\Alice - Luck", "85")
Voici l'interet de ce projet, rendre tous ça très simple !

Re: SimplyJson

Publié : lun. 23/mars/2020 16:07
par kernadec
Ombre
Arrete de perdre ton temp avec json
Pour en tirer une fiabilite il faut etre un expert coder
Je te conseil d apprendre le cobol les bases sont fiables
C est pour cela que les assurances et bien d autres structures
ont leurs bases de donnees en cobol db2 donc
Moralite bosse sur du cobol et tu trouveras du boulot
Lucratif ...
Ils fonts tous mumuse avec le json pour moi, il est pas fiable
A 100% donc je ne l utilise pas. Ya bien d autre moyen de faire
Des bases plus fiables.
Cordialement

Re: SimplyJson

Publié : lun. 23/mars/2020 16:20
par G-Rom
Resultat = CreateJSON(#JSON) >>> Renvoie une valeur non nulle si la collection JSON a été créée, zéro sinon.

Mais cette « Valeur » c'est quoi ?, rien n'est spécifier à ce sujet dans la doc.
Surement un pointeur, mais tu t'en fou de cela.
Tenez, demandez à un débutant de faire ceci:
La question est , pourquoi "un débutant" ferais du JSON ? d'ailleurs pourquoi toi tu en fait ? le JSON sert avant tout à répondre à une problématique , la plupart du temps , le json sert de chaîne d'échange entre un programme et un serveur web distant , évitant les problèmes d'endianess (boutisme en fr) que pourrais avoir un échange de donnée standard.
Un "débutant" , doit de prime abord aprendre la base , comme un code de ce genre qui se passe du JSON pour sauvegardé des données complexe :

Code : Tout sélectionner

Structure MesDatas
  ArticleID.l
  Code.w
  Facteur.f
  Truc.d
  Pouet.q
EndStructure


A.MesDatas
A\ArticleID = 42
A\code = 2568
A\Facteur = #PI
A\Truc = 42.698789
A\Pouet = 489648957



;-SAUVEGARDE
file = OpenFile(#PB_Any,"out.bin")
If file
  WriteData(file,@A,SizeOf(MesDatas)) 
  CloseFile(file)
EndIf



;-LECTURE
Vide.MesDatas
file = ReadFile(#PB_Any,"out.bin")
If file 
  ReadData(file,@Vide,SizeOf(MesDatas))  
  CloseFile(file)
EndIf

;-TEST
Debug Vide\ArticleID
Debug Vide\code
Debug Vide\Facteur
Debug Vide\Truc
Debug Vide\Pouet
La base quoi...

Re: SimplyJson

Publié : lun. 23/mars/2020 17:11
par falsam
Et bien voila. Aprés trois ou quatre topics de shadow sur son "simplyJson" retour à la case départ avec cette bonne réponse de G-Rom (sans aucune ironie)
G-Rom a écrit :la plupart du temps , le json sert de chaîne d'échange entre un programme et un serveur web distant
Ca permet aussi de sauvegarder des paramètres d'une application :wink:

Shadow tu connais ce tutoriel mais je te le donne à nouveau : https://www.purebasic.fr/french/viewtop ... 21&t=14511
kernadec a écrit :Arrete de perdre ton temp avec json. Pour en tirer une fiabilite il faut etre un expert coder
Allez Shadow je crois que tu vas arrêter là hein ?

Re: SimplyJson

Publié : lun. 23/mars/2020 18:32
par Shadow
Ouais, G-Rom à lancer un pavé à la mer, je savais même pas qu'on pouvait faire ça :lol:
Allez Shadow je crois que tu vas arrêter là hein ?
Jvé y pensser...
Merci à tous !

Re: SimplyJson

Publié : lun. 23/mars/2020 18:36
par G-Rom
Shadow a écrit :Ouais, G-Rom à lancer un pavé à la mer, je savais même pas qu'on pouvait faire ça
A toi maintenant de reprendre mon petit bout de code et d'essayer de sauvegardé pourquoi pas une liste complète de donnée au lieu d'une simple variable.
Falsam a écrit :]Ca permet aussi de sauvegarder des paramètres d'une application
Oui, tout comme le XML , ou une base de données , c'est pas le but premier d'un .json. ;)

Re: SimplyJson

Publié : lun. 23/mars/2020 18:40
par falsam
Shadow a écrit :Oui, tout comme le XML , ou une base de données , c'est pas le but premier d'un .json.
JSON vers structure ou list ou array ou map ca se fait en 3 lignes de codes et vice versa. Ce qui n'est pas le cas de XML ou d'une base de données.

Re: SimplyJson

Publié : lun. 23/mars/2020 19:02
par TazNormand
Shadow a écrit :Ouais, G-Rom à lancer un pavé à la mer, je savais même pas qu'on pouvait faire ça :lol:
Allez Shadow je crois que tu vas arrêter là hein ?
Jvé y pensser...
Merci à tous !
Miracle, quelqu'un a enfin réussi à ouvrir les yeux de Shadow :lol:

Re: SimplyJson

Publié : lun. 23/mars/2020 19:16
par falsam
Un exemple sur ce que j'ai dit précédement "JSON vers structure ou list ou array ou map ca se fait en 3 lignes de codes et vice versa"

Sauvegarde d'une structure.

Code : Tout sélectionner

Structure newSetup
  life.i
  kill.i
EndStructure

parameter.newSetup

parameter\kill = 123
parameter\life = 10

;Création d'une structure JSON
CreateJSON(0)

;Insertion de la structure dans la chaine JSON
InsertJSONStructure(JSONValue(0), parameter, newSetup)

;Sauvegarde de la chaine JSON 
SaveJSON(0, "setup.json")

Résultat
{"life":10,"kill":123}
Récupération d'une structure sauvegardée.

Code : Tout sélectionner

Structure newSetup
  life.i
  kill.i
EndStructure

parameter.newSetup

;Lecture du fichier JSON 
LoadJSON(0, "setup.json", #PB_JSON_NoCase)

;Extraction de la chaine JSOn vers la structure
ExtractJSONStructure(JSONValue(0), parameter, newSetup)

Debug parameter\kill  

Re: SimplyJson

Publié : lun. 23/mars/2020 19:39
par Shadow
Et comment faire avec des Map ?
Genre ça:

Code : Tout sélectionner

Structure JsonPatchData
  Value.s
EndStructure
Structure JsonPatch
  Map Member.JsonPatchData() ; Emplacement avec une clef au coeur du dossier (Patch).
EndStructure
Structure Json
  Map Patch.JsonPatch() ; Map qui sert pour le Patch (Adresse) des données.
EndStructure

Global NewMap SimplyJson.Json()

Re: SimplyJson

Publié : lun. 23/mars/2020 20:43
par G-Rom
falsam a écrit :
Shadow a écrit :Oui, tout comme le XML , ou une base de données , c'est pas le but premier d'un .json.
JSON vers structure ou list ou array ou map ca se fait en 3 lignes de codes et vice versa. Ce qui n'est pas le cas de XML ou d'une base de données.
Tu me quote , mais tu met Shadow ?? c'est moi qui t'ai répondu...

Re: SimplyJson

Publié : lun. 23/mars/2020 21:04
par Ollivier
C'est le confinement... Falsam a dépucelé la Sainte-Vierge de la Victoire qui attendait sagement dans son frigo en panne, un blend irlandais de 25 ans d'âge. Il déraille un peu...

Re: SimplyJson

Publié : lun. 23/mars/2020 21:32
par falsam
@G-Rom : Bizarre. J'ai sélectionné une de tes phrases puis bouton Quote ! Je ferais attention la prochaine fois.

Re: SimplyJson

Publié : lun. 23/mars/2020 21:38
par falsam
Shadow a écrit :Et comment faire avec des Map ?

Code : Tout sélectionner

Structure Address
  Actif.b
  County.i
EndStructure

NewMap Contacts.Address()

;Création d'une structure JSON
CreateJSON(0)

;Ajoutons deux élémement à la Map
AddMapElement(Contacts(), "Wagner")
With Contacts()
  \Actif = #True
  \County = 75
EndWith

AddMapElement(Contacts(), "Hilton")
With Contacts()
  \Actif = #True
  \County = 92
EndWith

;Insertion de la map  dans la chaine JSON 
InsertJSONMap(JSONValue(0), Contacts())

;Sauvegarde de la chaine JSON
SaveJSON(0, "contacts.json")

;Debug de la chaine JSON
Debug ComposeJSON(0, #PB_JSON_PrettyPrint)
Résultat

Code : Tout sélectionner

{
  "Wagner": {
      "Actif" : 1,
      "County": 75
    },
  "Hilton": {
      "Actif" : 1,
      "County": 92
    }
}

Re: SimplyJson

Publié : lun. 23/mars/2020 21:44
par falsam
Pour récupérer les données de JSON vers Map

Code : Tout sélectionner

Structure Address
  Actif.b
  County.i
EndStructure

NewMap Contacts.Address()

;Lecture du fichier JSON 
LoadJSON(0, "contacts.json", #PB_JSON_NoCase)

;Extraction de la chaine JSOn vers la liste chainée Contacts 
ExtractJSONMap(JSONValue(0), Contacts())

;Vérification de la map
ForEach Contacts()
  With Contacts()
    Debug MapKey(Contacts()) + " actif: " +  \Actif + " Country: " + \County
  EndWith
Next