JSON interdite [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

JSON interdite [Résolu]

Message par Kwai chang caine »

Bonjour à tous

Je sais pas si je suis le seul, mais j'y comprend quedal dans l'utilisation de la lib JSON :oops:
En fait, j'ai préféré parser à la mano mon texte, au bout de 1 heure à me masturber le cerveau :?
Puis une fois calmé, je me dit que si FRED il a fait cet avion c'est normalement pour se "simplifier" la live (loupé :mrgreen:)

Est ce que un de vous par simple pitié pour un "Pbien" au bord du gouffre, pourrait me dire, comment j'obtiens la suite de ce qui est dans

Code : Tout sélectionner

map("data")
Ou encore mieux, par extrême générosité, comment extraire toutes les données de ce JSON :oops:

Code : Tout sélectionner

NewMap Options.s()
Json$ = "{|data|:[{|id|:|123456|,|title|:|MyTitle|,|rating|:|5/10|,|Date|:|2019-03-15T14:24:00Z|,|descriptive|:[{|square|:|https://www.purebasic.fr|}],|Time|:300,|objectID|:|123456|,|queryID|:|MyQuery|,|position|:1,|stars|:[|core1|,|core2|,|core3|]}]}"

PbIdJson = ParseJSON(#PB_Any, ReplaceString(Json$, "|", Chr(34)))

If PbIdJson
 
 ExtractJSONMap(JSONValue(PbIdJson), Options())    

 ForEach Options()
  Debug "Clé MAP = " + MapKey(Options())
  Debug "Valeur MAP = " + Options() + #CRLF$
  Debug Options("data")
 Next
Résultat
Compilateur a écrit :Clé MAP = data
Valeur MAP =
*****************************************
Taille totale de la Map = 1
Je vous souhaite une bonne journée
Dernière modification par Kwai chang caine le ven. 23/juil./2021 16:14, modifié 1 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: JSON interdite

Message par Marc56 »

Bonjour KCC,

Les éléments de ta map étant des chaines de caractères (NewMap Options.s()), elle ne peuvent afficher en une seule fois l'objet JSON qui est ici une structure.

Code : Tout sélectionner

NewMap Options.s()
Json$ = "{|data|:[{|id|:|123456|,|title|:|MyTitle|,|rating|:|5/10|,|Date|:|2019-03-15T14:24:00Z|,|descriptive|:[{|square|:|https://www.purebasic.fr|}],|Time|:300,|objectID|:|123456|,|queryID|:|MyQuery|,|position|:1,|stars|:[|core1|,|core2|,|core3|]}]}"

PbIdJson = ParseJSON(#PB_Any, ReplaceString(Json$, "|", Chr(34)))

; Afficher l'objet
Debug ComposeJSON(PbIdJson, #PB_JSON_PrettyPrint)

If PbIdJson
    ExtractJSONMap(JSONValue(PbIdJson), Options())    
    
    ForEach Options()
        Debug "Clé MAP = " + MapKey(Options())
        Debug "Valeur MAP = " + Options() + #CRLF$
        Debug Options("data")
    Next
EndIf

ShowVariableViewer()
CallDebugger
Debug ComposeJSON(PbIdJson, #PB_JSON_PrettyPrint)

Code : Tout sélectionner

{
  "data": [
      {
        "Time"       : 300,
        "Date"       : "2019-03-15T14:24:00Z",
        "rating"     : "5/10",
        "stars"      : [
            "core1",
            "core2",
            "core3"
          ],
        "queryID"    : "MyQuery",
        "position"   : 1,
        "descriptive": [
            {
              "square": "https://www.purebasic.fr"
            }
          ],
        "title"      : "MyTitle",
        "objectID"   : "123456",
        "id"         : "123456"
      }
    ]
}
Donc il faut créer la structure à l'avance (ou parser pour la créer) ou utiliser les fonctions chaines (ou une RegEx :mrgreen: ) à condition d'avoir des ID des clé uniques.
:wink:
Demivec
Messages : 90
Inscription : sam. 18/sept./2010 18:13

Re: JSON interdite

Message par Demivec »

Une solution:

Code : Tout sélectionner

EnableExplicit

; Procedure.s type_string(value) ;return type as string for JSON values of null, array, or object or it's contents if a number, boolean or string
;   Select JSONType(value)
;     Case #PB_JSON_Null:    ProcedureReturn "null"
;     Case #PB_JSON_String:  ProcedureReturn GetJSONString(value)
;     Case #PB_JSON_Number:  ProcedureReturn StrD(GetJSONDouble(value))  ;integer, quad, float also  
;     Case #PB_JSON_Boolean: ProcedureReturn Str(GetJSONBoolean(value))
;     Case #PB_JSON_Array:   ProcedureReturn "array"
;     Case #PB_JSON_Object:  ProcedureReturn "object"
;   EndSelect
; EndProcedure

Procedure isJSON_Array(value)
  ProcedureReturn Bool(JSONType(value) = #PB_JSON_Array)
EndProcedure

Procedure isJSON_Object(value)
  ProcedureReturn Bool(JSONType(value) = #PB_JSON_Object)
EndProcedure

Structure data_parts ;grouped by type ; regroupés par type
  Map opt_s.s()
  Map opt_n.i()
  Array stars.s(0)
  Map descriptive.s() ;inside an array ; à l'intérieur d'une table
EndStructure

Define Options.data_parts, Json$
Json$ = "{|data|:[{|id|:|123456|,|title|:|MyTitle|,|rating|:|5/10|,|Date|:|2019-03-15T14:24:00Z|,|descriptive|:[{|square|:|https://www.purebasic.fr|}],|Time|:300,|objectID|:|123456|,|queryID|:|MyQuery|,|position|:1,|stars|:[|core1|,|core2|,|core3|]}]}"

Define PbIdJson, object_1, array_1, object_2, i
PbIdJson = ParseJSON(#PB_Any, ReplaceString(Json$, "|", Chr(34)))

If PbIdJson
  object_1 = JSONValue(PbIdJson)
  If isJSON_Object(object_1)
    array_1 = GetJSONMember(object_1, "data")
    If isJSON_Array(array_1)
      object_2 = GetJSONElement(array_1, 0) ;assume only one element; supposer qu'un seul élément
      
      ExtractJSONArray(GetJSONMember(object_2, "stars"), options\stars())
      ExtractJSONMap(object_2, Options\opt_s())
      ExtractJSONMap(object_2, Options\opt_n())
      ExtractJSONMap(GetJSONElement(GetJSONMember(object_2, "descriptive"), 0), options\descriptive()) ;assume only one element; supposer qu'un seul élément
      
      Debug "======strings========"
      ForEach Options\opt_s()
        ;remove blank string map entries (= not strings) from string map
        ; supprimer les entrées vides de la carte des chaînes (= pas de chaînes) de la carte des chaînes
        If options\opt_s() = ""
          DeleteMapElement(options\opt_s())
        EndIf
      Next

      ForEach Options\opt_s()
        ;remove keys for filled entries in string map from number map (because they were string entries)
        ; supprimer les clés des entrées renseignées dans la carte de chaîne de la carte numérique (parce qu'il s'agissait d'entrées de chaîne)
        If options\opt_s() <> ""
          DeleteMapElement(options\opt_n(), MapKey(options\opt_s()))
        EndIf
        Debug MapKey(Options\opt_s()) + " : " + Options\opt_s()
      Next
      ;remove keys for arrays and array/maps from number map
      ; retirer les clés du tableau et le tableau/carte de la carte numérique
      DeleteMapElement(options\opt_n(), "stars")
      DeleteMapElement(options\opt_n(), "descriptive")
      Debug "======numbers========"
      ForEach Options\opt_n()
        Debug MapKey(Options\opt_n()) + " : " + Str(Options\opt_n())
      Next
      Debug "=====star array======"
      For i = 0 To ArraySize(options\stars())
        Debug "[" + i +"] " + options\stars(i)
      Next
      Debug "=descriptive array object ========"
      ForEach Options\descriptive()
        Debug "[0] " + MapKey(Options\descriptive()) + " : " + Options\descriptive()
      Next
    EndIf
  EndIf
EndIf
Output:

Code : Tout sélectionner

======strings========
title : MyTitle
id : 123456
objectID : 123456
rating : 5/10
queryID : MyQuery
Date : 2019-03-15T14:24:00Z
======numbers========
position : 1
Time : 300
=====star array======
[0] core1
[1] core2
[2] core3
=descriptive array object ========
[0] square : https://www.purebasic.fr
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: JSON interdite

Message par Kwai chang caine »

Tout d'abord, bonjour à vous deux et mille mercis de votre précieuse aide 8)

@MARCO
Alors là, une fois de plus tu m'épates.... 8O

Code : Tout sélectionner

ComposeJSON(PbIdJson, #PB_JSON_PrettyPrint)
8O

Sérieux, si je ne connaissais pas notre FRED, je dirais "quel cerveau malade peut créer une librairie aussi difficile à utiliser et surtout comprendre ?" :?
Je crois que c'est bien la première fois que je ressent ça avec PB (Ah non, y'a les "prototrucs" et l'UNICODE qui sont jamais passés non plus) :oops:
Alors juste cette petite fonction fait tout le job ? 8O et ben j'étais pas prés de trouver tout seul :oops:

En fait quand on regarde le JSON, on sait pas si c'est un objet, un tableau, une Map etc....c'est tout imbriqué avec des "[", des "{" ... 8O
Et j'ai pas vu de codes sur les forums, capables de lire n'importe quel JSON genre dans un Treview, et de dire en face : "ça c'est un tableau", "ça une MAP", "ça un objet" etc ...
Comme ça... les inhibés du bulbe comme moi, pourrait essayer de comprendre la structure du fichier qu'il doit ensuite parser :idea:
Y'a noir de site qui parsent le JSON, mais rien vu qui analyse pour savoir quelle fonction utiliser pour extraire, une map, un tableau ou un objet :|
Je pense que ce sont des valeurs propres à PB, c'est peut être la raison de la chose :idea:
En tout cas merci de ton code simple et efficace, une fois de plus tu me sauves :wink:
Celui qui a mangé un clown a écrit :ou une RegEx :mrgreen:
Mouaaaarffff !!!!!

Image

Super bonne celle là !!!!! :lol:
Les REGEX c'est un peu comme le "Malbolge", celui qui a créé ça, devait avoir un QI de 500 et se demander qu'est ce qu'il pourrait créer d'impossible à comprendre et à lire, pour faire chier toute leur vie les pelos de mon genre :oops:

Image

Ou alors.....c'était un pote de chambre à RAMSES :mrgreen:

Image


@DEMIVEC
Ouahh !! quel code !!! 8O
Il va me falloir plusieurs jours pour le comprendre :oops:
Merci beaucoup de ton code et aussi de venir de l'UTAH 8O visiter le forum Français 8)
Waoouuh !!! What a code !!! 8O
It will take me several days to undestand it :oops:
Thank you very much for your code, and also for coming sometime from UTAH 8O to visit the French forum 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre