IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

un résultat JSON que je n'arrive pas à traiter


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 252
    Points
    41 252
    Billets dans le blog
    63
    Par défaut un résultat JSON que je n'arrive pas à traiter
    Bonjour,

    ce lundi je suis bouché à l'émeri.
    j'ai ce résultat (taux de devises obtenu via api.freecurrencyapi.com)
    {"data":
    {"AUD":1.555397,"BGN":1.9559,"BRL":5.543935,"CAD":1.440726,"CHF":0.988599,"CNY":7.33797,"CZK":23.711723,"DKK":7.447198,"EUR":1,"GBP":0.888193,
    "HKD":8.382221,"HUF":383.983663,"IDR":16204.729963,"ILS":3.795524,"INR":88.434198,"ISK":153.990826,"JPY":143.51116,"KRW":1384.678343,"MXN":19.
    627914,"MYR":4.735549,"NOK":10.999526,"NZD":1.713609,"PHP":59.327931,"PLN":4.761781,"RON":4.915187,"RUB":79.068292,"SEK":11.178534,"SGD":1.42
    8641,"THB":36.797208,"TRY":20.154229,"USD":1.068489,"ZAR":19.312965}}
    Comment je peux traiter ça, j'ai l'habitude de tableaux, là, je sèche lamentablement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    aStream:=TmemoryStream.Create;
    try
    //  NetHTTPRequest1.Get(url,aStream);
    //  Memo1.Lines.LoadFromStream(aStream);
      aJsonString:=TJSONString.Create(Memo1.Lines.Text);
    // ? comment obtenir le taux de USD ?
    finally
      aStream.Free;
    end;
    Idem, selon la documentation je devrais obtenir
    {
    "meta": {
    "last_updated_at": "2022-01-01T23:59:59Z"
    },
    "data": {
    "AED": 3.67306,
    "AFN": 91.80254,
    "ALL": 108.22904,
    "AMD": 480.41659,
    "...": "150+ more currencies"
    }
    }
    or, je n'obtiens que la partie "data" bien évidemment obtenir cette date serait un plus

    Bref, ce matin c'est pas la joie du coding

  2. #2
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    Le hic c'est qu'en JSON les tableaux sont forcément avec un index numérique, donc s'ils mettent autre chose la stérilisation transforme forcément ça en objet si la librairie de conversion utilisée est bien fichue.

    Dans ton cas veux-tu parcourir la liste des taux ou en obtenir un en particulier ?

    Si c'est un seul, il te suffit de le récupérer en mettant son nom (par exemple EUR) en dur comme champ de ton objet data, récupéré en numérique flottant (ou malheureusement entier puisqu'il n'y a pas moyen de le savoir d'avance).

    Si tu veux tout parcourir tu peux les Pairs de l'objet "Data" qui est indexé numériquement et te donnera accès aux Key/Value des propriétés de l'objet.
    https://docwiki.embarcadero.com/Libr...ONObject.Pairs

    Par contre je ne vois pas trop pourquoi tu passes par un TJSONString.

    La chaine récupérée par l'API est un objet, donc TJSONObject.Parse() as TJSONObject, il a une propriété "Data" que tu peux avoir en TryGetValue("Data") as TJSONObject dans laquelle tu trouves les "devise=taux".

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 252
    Points
    41 252
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par pprem Voir le message
    Dans ton cas veux-tu parcourir la liste des taux ou en obtenir un en particulier ?
    La liste pour ne faire qu'une seule interrogation

    Par contre je ne vois pas trop pourquoi tu passes par un TJSONString.
    je l'ai écrit, c'est le brouillard aujourd'hui

    La chaine récupérée par l'API est un objet, donc TJSONObject.Parse() as TJSONObject, il a une propriété "Data" que tu peux avoir en TryGetValue("Data") as TJSONObject dans laquelle tu trouves les "devise=taux".
    justement le TryGetValue me pose des problèmes que je ne comprends pas

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 252
    Points
    41 252
    Billets dans le blog
    63
    Par défaut
    Bon, j'ai fini par trouver ce qui me coinçait : Il y a un slinebreak qui me gênait ! Grâce soit rendu au 3°argument de TJSonObject.ParseJSONValue qui m'a mis sur la piste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure _Parse_JSonValue; // lister les devises
    var
       JSonObject:TJSonObject;
       JSonPair:TJSONPair;
       st:string;
       i : integer;
    Begin
       st :=Replacestr(Memo1.Lines.Text,slinebreak,'');
       JsonObject := TJSonObject.ParseJSONValue(st,false,true) as TJSONObject;  // 
       memo2.Lines.Clear;
       if JsonObject.TryGetValue('data',JSonObject) then
         begin
          for i:=0 to JSonObJect.Count-1
           do
            memo2.Lines.Add(JSonObject.Pairs[i].JsonString.ToString+'='+JSonObject.Pairs[i].JsonValue.ToString);
         end;
       JSonObject.Free;
    End;
    J'ai au moins les cours donc, YAPLUKA
    toutefois je ne comprends pas où se trouve "meta" de la doc

  5. #5
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    leur serveur d'API déconne ou ils ne transmettent plus l'info et n'ont pas mis la doc à jour

    par contre, dans ton code, gaffe aux pertes de mémoire : JSonObject est écrasé par le contenu de Data et du coup tu ne libères que cette partie en fin, il te faut 2 TJSONObject pour faire ça proprement et libérer le global

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/04/2006, 20h25
  2. Réponses: 12
    Dernier message: 11/04/2006, 17h36
  3. boucle que je n'arrive pas à réaliser...
    Par mussara dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2006, 12h24
  4. Une requête que je n'arrive pas à faire
    Par Denti-fritz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/12/2005, 13h53
  5. problème que je n'arrive pas à résoudre de façon récursive
    Par miam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/07/2004, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo