Demande d'aide avec la lecture de fichier JSON

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Demande d'aide avec la lecture de fichier JSON

Message par cage »

Bonsoir a tous,

Votre aide serait la bienvenue car je tourne en rond pour lire un fichier json avec le format suivant:

Code : Tout sélectionner

{
  "success": true,
  "result" : {
      "dvb-Canal 31"     : {
          "has_abo"    : false,
          "available"  : true,
          "short_name" : "Canal 31",
          "has_service": true,
          "logo_url"   : "/api/latest/tv/img/channels/logos68x60/dvb-Canal 31.png",
          "name"       : "Canal 31",
          "uuid"       : "dvb-Canal 31"
        },
      "uuid-webtv-290"   : {
          "has_abo"    : false,
          "available"  : true,
          "short_name" : "France 3 Cote-d'Azur",
          "has_service": true,
          "logo_url"   : "/api/latest/tv/img/channels/logos68x60/uuid-webtv-290.png",
          "name"       : "France 3 Côte-d'Azur",
          "uuid"       : "uuid-webtv-290"
        }
    }
}
Ce fichier comporte un grand nombre d'enregistrements qui correspondent a toutes les chaines diffusées sur les Freebox
Je voudrais pouvoir lire tous les objets tels que "dvb-Canal 31" et "uuid-webtv-290" ainsi que toutes les valeurs qui leurs sont attachées.
J'ai commencé a écrire un bout de code pour capitaliser ce que j'ai compris, notamment le fait que le contenu d'un fichier json est soit array, soit objet (pour simplifier).
Voici le code :

Code : Tout sélectionner

EnableExplicit

Define PLAYLIST$=".\m3u\Freebox\playlist.m3u"
Define JSONFILE$=".\m3u\Freebox\playlist.json"
Define JSONTEXT$=".\m3u\Freebox\playlist.json.txt"

Define PLAYURL$ = "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u"
Define JSONURL$ = "http://mafreebox.freebox.fr/api/v3/tv/channels/"

Define JSON, OUT, texte$

; si le fichier playlist.json n'existe pas, on le télécharge.
If FileSize(JSONFILE$) = -1
  Debug "Le fichier json n'existe pas."
  If ReceiveHTTPFile(JSONURL$, JSONFILE$)
    Debug "Téléchargement json réussi."
  Else
    Debug "Téléchargement json non réussi."
  EndIf
Else
  Debug "Le fichier json existe."
EndIf

; si le fichier playlist.json.txt n'existe pas, on le crée.
If FileSize(JSONTEXT$) = -1
  Debug "Le fichier json.txt n'existe pas."
  OUT = CreateFile(#PB_Any, JSONTEXT$, #PB_UTF8)
  If OUT
    JSON = LoadJSON(#PB_Any, JSONFILE$, #PB_JSON_NoCase)
    If JSON 
      Debug "Lecture du fichier json réussie."
      texte$ = ComposeJSON(JSON, #PB_JSON_PrettyPrint)
      WriteString(OUT, texte$, #PB_UTF8)
      FreeJSON(JSON)
    Else
      Debug "Erreur lecture du fichier json : " + JSONErrorMessage()
    EndIf
    CloseFile(OUT)
  EndIf
Else
  Debug "Le fichier json.txt existe."
EndIf

Debug JSONFILE$+" = "+Str(Round(FileSize(JSONFILE$)/1024,#PB_Round_Up)) + " Ko"
Debug JSONTEXT$+" = "+Str(Round(FileSize(JSONTEXT$)/1024,#PB_Round_Up)) + " Ko"

Structure chaine
  uuid.s
  name.s
  avalaible.a
  logo_url.s
  has_service.a
  short_name.s
  has_abo.a
EndStructure

Global NewList chaines.chaine()
;Global NewMap chaines.chaine()

Define jsonObjectValue, object$, value

JSON = LoadJSON(#PB_Any, JSONTEXT$, #PB_JSON_NoCase)

If JSON
  ; get the json object value
  jsonObjectValue = JSONValue(JSON)
  ; retrieve the members of the json object
  If ExamineJSONMembers(jsonObjectValue)
    ; iterate through the members of the json object
    While NextJSONMember(jsonObjectValue)
      object$ = JSONMemberKey(jsonObjectValue)
      If JSONType(JSONMemberValue(jsonObjectValue)) = #PB_JSON_Boolean
        value = GetJSONBoolean(JSONMemberValue(jsonObjectValue))
        Debug "> " + object$ + " = " + value
      Else
        Debug "> " + object$
      EndIf
    Wend
  EndIf
  ; clear & release the json object
  FreeJSON(JSON)
EndIf

; https://www.purebasic.fr/english/viewtopic.php?t=72004
; https://www.purebasic.fr/english/viewtopic.php?t=74732
Pour le moment, ce code me permet d'otenir le résultat suivant:

Code : Tout sélectionner

Le fichier json existe.
Le fichier json.txt existe.
.\m3u\Freebox\playlist.json = 237 Ko
.\m3u\Freebox\playlist.json.txt = 374 Ko
> success = 1
> result
Je n'arrive qu'a obtenir les 2 premiers objets, a savoir "success": true et "result"
Toute aide que vous pourriez m'apporter pour me mettre sur la bonne voie serait la bienvenue.
Merci a vous,
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par Ar-S »

Je ne suis pas du tout adepte du json mais n'aurais tu pas oublié des crochets ?
"result" : [ {
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Demande d'aide avec la lecture de fichier JSON

Message par brossden »

Avec mon code en Windev j'obtiens un fichier de 241186 octets. Par contre il ne faut pas de "/" en fin d'URL
code :
txt est une chaîne
HTTPRequête("http://mafreebox.freebox.fr/api/v3/tv/channels")
txt = HTTPDonneRésultat(httpRésultat)
VersPressePapier(txt)
Trace( Taille(txt))
Voilà le début du fichier :
{"success":true,"result":{"uuid-webtv-404":{"uuid":"uuid-webtv-404","name":"TEVA","available":true,"logo_url":"\/api\/latest\/tv\/img\/channels\/logos68x60\/uuid-webtv-404.png","has_service":true,"short_name":"TEVA","has_abo":true},"uuid-webtv-1204":{"uuid":"uuid-webtv-1204","name":"Syfy","available":false,"logo_url":"\/api\/latest\/tv\/img\/channels\/logos68x60\/uuid-webtv-1204.png","has_service":false,"short_name":"Syfy","has_abo":false},"uuid-webtv-958":{"uuid":"uuid-webtv-958","name":"Valenciennes TV","available":false,"logo_url":"\/api\/latest\/tv\/img\/channels\/logos68x60\/uuid-webtv-958.png","has_service":false,"short_name":"Valenciennes TV","has_abo":false},"uuid-webtv-891":{"uuid":"uuid-webtv-891","name":"Lucky
Dernière modification par brossden le mar. 22/août/2023 16:16, modifié 1 fois.
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

Bonjour,
Je ne suis pas du tout adepte du json mais n'aurais tu pas oublié des crochets ?
"result" : [ {
Et non, le fichier json est obtenu en téléchargement via l'url http://mafreebox.freebox.fr/api/v3/tv/channels/ (abonnés Freebox) et il ne comporte aucun symbole "[" et "]"
Je ne suis pas non plus adepte du JSON, mais là, je n'ai pas le choix.
Je ne peux donc pas utiliser un certain nombre de commandes JSON qui sont faites pour les Array
Il faut que je me débrouille avec les commandes JSON pour Objects
Le fichier téléchargé ne comporte que 2 lignes et pèse 237 Ko
Je transforme le fichier avec ComposeJSON(JSON, #PB_JSON_PrettyPrint) et j'obtiens un fichier qui pèse 374 Ko pour 9752 lignes

Le fichier comporte au début un champ "success" qui vaut True (1) ou False (0)
Si ce champ "success" vaut 1 (True) alors la requête est valide et "result" contient toutes les données.

Ce que je n'arrive pas a faire, c'est lire les objets du champs "result" et leurs valeurs associées.

J'ai lu un certain nombre de posts, dont celui de 'falsam' JSON (JavaScript Object Notation), mais ça ne m'a pas aidé pour résoudre mon problème de lecture des données.
La documentation Purebasic est quasi inexistante pour le JSON et quand elle existe, c'est toujours des Array [...]
Autant j'ai mis 2 minutes a maitriser les fichiers ini, autant là, je galère.

D'où mon appel a l'aide.
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

@ brossden

As-tu essayé mon code avec PB (6.00 LTS pour moi) ?

Si on colle l'adresse dans Firefox, avec ou sans / a la fin, ça fonctionne.
Idem avec PB

cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Demande d'aide avec la lecture de fichier JSON

Message par brossden »

je t'ai mis dans mon précédent post le début du fichier
Denis

Bonne Jounée à tous
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Demande d'aide avec la lecture de fichier JSON

Message par brossden »

Pour moi ton code ne donne rien !

voilà de lien de l'exécutable que j'ai testé :
https://drive.google.com/file/d/1vwXYtV ... sp=sharing

le fichier complet sera dans ton presse papier
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

Il doit falloir modifier ces trois variables:

Code : Tout sélectionner

EnableExplicit

Define PLAYLIST$=".\m3u\Freebox\playlist.m3u"
Define JSONFILE$=".\m3u\Freebox\playlist.json"
Define JSONTEXT$=".\m3u\Freebox\playlist.json.txt"
par

Code : Tout sélectionner

EnableExplicit

Define PLAYLIST$="playlist.m3u"
Define JSONFILE$="playlist.json"
Define JSONTEXT$="playlist.json.txt"
car si l'arborescence n’existe pas, mon code ne la crée pas.

Ton exe me donne un résultat sur une seule ligne, normal.
En plus, il télécharge un certain nombre de wd250*.dll dans mon dossier Téléchargements
Mon code le transforme en quelque chose de plus lisible pour l'homme.
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Demande d'aide avec la lecture de fichier JSON

Message par brossden »

Voilà un nouveau code qui affiche le texte reçu par la requête :

https://drive.google.com/file/d/129IfAo ... sp=sharing
Denis

Bonne Jounée à tous
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: Demande d'aide avec la lecture de fichier JSON

Message par brossden »

Un dernier code pour la route :

https://drive.google.com/file/d/1hzNCuv ... sp=sharing

il écrit le texte reçu dans une fenêtre avec ascenseur et créer un fichier avec ce même texte !
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

Tes exe fonctionnent (dans un bac a sable, je suis toujours prudent) mais ne me permettent pas d'avancer avec mon problème de lecture du fichier JSON

Voici un bout de mon code de mon post initial qui expose mieux mon besoin et mon problème

Code : Tout sélectionner

JSON = LoadJSON(#PB_Any, JSONTEXT$, #PB_JSON_NoCase)

If JSON
  ; get the json object value
  jsonObjectValue = JSONValue(JSON)
  ; retrieve the members of the json object
  If ExamineJSONMembers(jsonObjectValue)
    ; iterate through the members of the json object
    While NextJSONMember(jsonObjectValue)
      object$ = JSONMemberKey(jsonObjectValue)
      If JSONType(JSONMemberValue(jsonObjectValue)) = #PB_JSON_Boolean
        value = GetJSONBoolean(JSONMemberValue(jsonObjectValue))
        ; Tout commence ici
        ; le premier objet lu est "success"
        ; {
        ;   "success": true,
        ;   "result" : {
        ;       "dvb-Canal 31"     : {
        Debug "> " + object$ + " = " + value
        ; Si "success": true alors les données sont valides
        If object$ = "success" And value = #True
          ; C'est ici que devrait-êtres le traitement des données
          ; Mais ça, je ne sais pas encore comment
          ; Donc, a votre bon coeur
          Continue
        Else
          Break
        EndIf
      Else
        Debug "> " + object$
      EndIf
    Wend
  EndIf
  ; clear & release the json object
  FreeJSON(JSON)
EndIf
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Demande d'aide avec la lecture de fichier JSON

Message par boddhi »

Salut cage

Un code à l'arrache :

Code : Tout sélectionner

EnableExplicit

Structure DONNEESCHAINE
  uuid.s
  name.s
  ; ///////////////////////////////////////
  ;avalaible.a     => Mauvaise orthographe
  available.a     
  ; ////////////////////////////////////////
  logo_url.s
  has_service.a
  short_name.s
  has_abo.a
EndStructure
; ///////////////////////////////////////
Structure CHAINE
  NomCanal.s
  DonneesChaines.DONNEESCHAINE
EndStructure
; ///////////////////////////////////////

Global NewList chaines.chaine()
;Global NewMap chaines.chaine()

Define json, jsonObjectValue

; ///////////////////////////////////////////////////////////////////////////
Define.s ChaineJSON
ChaineJSON="{"+
           Chr(34)+"success"+Chr(34)+": true,"+
           Chr(34)+"result"+Chr(34)+" : {"+
           Chr(34)+"dvb-Canal 31"+Chr(34)+"   : {"+
           Chr(34)+"has_abo"+Chr(34)+"        :   false,"+
           Chr(34)+"available"+Chr(34)+"      :   true,"+
           Chr(34)+"short_name"+Chr(34)+"     :   "+Chr(34)+"Canal 31"+Chr(34)+","+
           Chr(34)+"has_service"+Chr(34)+"    :   true,"+
           Chr(34)+"logo_url"+Chr(34)+"       :   "+Chr(34)+"/api/latest/tv/img/channels/logos68x60/dvb-Canal 31.png"+Chr(34)+","+
           Chr(34)+"name"+Chr(34)+"           :   "+Chr(34)+"Canal 31"+Chr(34)+","+
           Chr(34)+"uuid"+Chr(34)+"           :   "+Chr(34)+"dvb-Canal 31"+Chr(34)+
           "},"+
           Chr(34)+"uuid-webtv-290"+Chr(34)+" : {"+
           Chr(34)+"has_abo"+Chr(34)+"        :   false,"+
           Chr(34)+"available"+Chr(34)+"      :   true,"+
           Chr(34)+"short_name"+Chr(34)+"     :   "+Chr(34)+"France 3 Cote-d'Azur"+Chr(34)+","+
           Chr(34)+"has_service"+Chr(34)+"    :   true,"+
           Chr(34)+"logo_url"+Chr(34)+"       :   "+Chr(34)+"/api/latest/tv/img/channels/logos68x60/uuid-webtv-290.png"+Chr(34)+","+
           Chr(34)+"name"+Chr(34)+"           :   "+Chr(34)+"France 3 Côte-d'Azur"+Chr(34)+","+
           Chr(34)+"uuid"+Chr(34)+"           :   "+Chr(34)+"uuid-webtv-290"+Chr(34)+
           "}"+
           "}"+
           "}"
; ------- !!!! IMPORTANT !!!! ----------
; Remplacer les valeurs true et false pour qu'elles puissent être récupérées via la structure DONNEESCHAINE
ChaineJSON=ReplaceString(ChaineJSON,": true,",":1,")
ChaineJSON=ReplaceString(ChaineJSON,": false,",":0,")
; -----------------------------
JSON = ParseJSON(#PB_Any, ChaineJSON, #PB_JSON_NoCase)
; ///////////////////////////////////////////////////////////////////////////

If JSON
  ; get the json object value
  ; On pointe vers le membre 'success' pour obtenir sa valeur
  jsonObjectValue = GetJSONMember(JSONValue(JSON),"success")
  If jsonObjectValue ; Si l'objet 'success" a été trouvé
    If GetJSONInteger(jsonObjectValue) ; Si la valeur de 'success" est égale à 1 ('true')
      Debug "Retour Free : Succès"
      ; On pointe vers le membre 'result' pour récupérer la collection de sous-membres
      jsonObjectValue = GetJSONMember(JSONValue(JSON),"result")
      If jsonObjectValue ; si l'objet 'result' a été trouvé
        If ExamineJSONMembers(jsonObjectValue) ; si il contient des membres
          While NextJSONMember(jsonObjectValue)
            AddElement(chaines())
            With chaines()
              \NomCanal=JSONMemberKey(jsonObjectValue)
              ExtractJSONStructure(JSONMemberValue(jsonObjectValue),\DonneesChaines,DONNEESCHAINE)
            EndWith
          Wend
        EndIf
      Else
        Debug "Pas de membre 'Result' !"
      EndIf
    Else
      Debug "Retour Free : Échec"
    EndIf
  Else
    Debug "Pas de membre 'Success' !"
  EndIf  
  ; clear & release the json object
  FreeJSON(JSON)
EndIf
ForEach chaines()
  Debug chaines()\NomCanal+" :"
  With chaines()\DonneesChaines
    Debug "  name : "+\name
    Debug "  has abo : "+\has_abo
    Debug "  available : "+\available
    Debug "  short name : "+\short_name
    Debug "  has service : "+\has_service
    Debug "  logo url : "+\logo_url
    Debug "  uuid : "+\uuid
  EndWith
Next
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

Bonsoir boddhi,

Je vais regarder ton code avec attention, mais déjà, je vois que tu joue avec les données qui sont tirées d'un fichier téléchargé sur le net et fourni par mon FAI Free.

Code : Tout sélectionner

Define.s ChaineJSON
ChaineJSON="{"+
Je ne peux pas modifier le fichier reçu, car une fois cette étape franchie, j'aurais d'autres fichiers a télécharger avec la même structure.
Je me vois donc obligé de garder les fichiers tels qu'ils sont.

Je vais voir si je peux avancer en regardant ton code.

Merci a toi,
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

Super, et désolé, j'ai parlé un peu vite dans mon précédant post.

Pour que ton code fonctionne, il fallait que tu mettes en place une chaine ChaineJSON en partant des quelque données que j'avais mis dans mon post.
Du coup, je n'ai eu qu'a remplacer ChaineJSON par

Code : Tout sélectionner

JSON = ReadFile(#PB_Any, JSONTEXT$)
If JSON
  While Eof(JSON) = 0
    ChaineJSON + ReadString(JSON)
  Wend
  CloseFile(JSON)
EndIf
pour que ton code fonctionne comme attendu.
Pour
Un code à l'arrache :
tu as tout bon du premier coup.

Donc, un grand merci.

Il me reste a bien étudier ton code pour avancer dans la compréhension du JSON, mais ça attendra demain si je puis dire vu l'heure.
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Demande d'aide avec la lecture de fichier JSON

Message par boddhi »

Content d'avoir pu t'aider :wink:

N'hésite pas si tu as besoin, j'en ai tellement chié avec le JSON que je peux dire que je maîtrise un peu :lol:
Répondre