1 pièce(s) jointe(s)
Interroger un web service JSON
Bonjour !
Je vous propose d'apprendre à interroger un web service JSON et à analyser les données reçues.
Le web service que j'ai choisi pour cet exemple fournit des informations sur le calendrier liturgique catholique. La documentation de l'API se trouve à l'adresse suivante :
http://calapi.inadiutorium.cz/api-doc
Je souhaite consulter la date du jour dans le calendrier. Voici comment interroger le web service :
Code:
1 2 3 4 5 6 7 8 9 10 11
| uses
fphttpclient;
const
URL = 'http://calapi.inadiutorium.cz/api/v0/fr/calendars/general-fr/today';
var
vJSONText: string;
begin
vJSONText := TFPCustomHTTPClient.SimpleGet(URL); |
Afin de bien comprendre ce qui se passe (et afin de pouvoir éventuellement travailler sans connexion), je colle directement dans mon code la chaîne de caractères renvoyée précédemment par la méthode SimpleGet :
Code:
vJSONText := '{"date":"2018-04-01","season":"easter","season_week":1,"celebrations":[{"title":"Dimanche de Pâques de la Résurrection du Seigneur","colour":"white","rank":"Triduum Pascal","rank_num":1.1}],"weekday":"sunday"}';
Voici comment convertir cette chaîne de caractères en données JSON sous la forme du type TJSONData :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| uses
fpjson, jsonparser;
{ ... }
var
{ ... }
vJSONData: TJSONData;
begin
{ ... }
vJSONData := GetJSON(vJSONText); |
Le premier avantage de cette conversion est de pouvoir reformater la chaîne de caractères :
Code:
WriteLn(vJSONData.FormatJSON());
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| {
"date" : "2018-04-01",
"season" : "easter",
"season_week" : 1,
"celebrations" : [
{
"title" : "Dimanche de Pâques de la Résurrection du Seigneur",
"colour" : "white",
"rank" : "Triduum Pascal",
"rank_num" : 1.1000000000000001E+000
}
],
"weekday" : "sunday"
} |
Le principal avantage est de pouvoir accéder à la donnée de son choix :
Code:
WriteLn(vJSONData.FindPath('celebrations').Items[0].FindPath('title').AsString);
Non seulement ça fonctionne, mais à présent les accents s'affichent correctement (dans la console de Notepad++).
Code:
Dimanche de Pâques de la Résurrection du Seigneur
Comme vous le voyez, on accède à une table associative ({}) par la méthode FindPath, et on accède à un tableau ([]) par la variable Items.
Vous trouverez ci-joint le code source complet de l'exemple.
Joyeuses Pâques !
Base JSON des données des exoplanètes du projet Exoclock
Bonsoir,
Il y a cette base ( URL_requete:='https://www.exoclock.space/database/planets_json' ) que j'essaie d'utiliser.
Mais le parseur ne crée qu'un élément de la collection sur deux. Or, la taille de la collection (collection.count=777) est correcte d'où plantage (List index (388) out of bound)...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
...
type
T_Exoplanete = record
nom,priorite : string; { priorité des observations }
end;
var
exoplanete_elements : array of T_exoplanete;
f_log : textfile;
procedure DoParse(parseur : TJSONParser);
var
js : TJSONData;
star,collection : TJSONObject;
i : integer;
result_ok : boolean;
begin
Try
js:=parseur.Parse;
Try
If Assigned(js) then
begin
collection :=TJSONObject(js);
nb_exoplanete:=collection.count+1;
Setlength(exoplanete_elements,nb_exoplanete);
result_ok:=false;
for i:=0 to nb_exoplanete-1 do
begin
star:=TJSONObject(collection.Extract(i));
with star,exoplanete_elements[i] do
begin
nom:=Strings['name'];
priorite:=Strings['priority'];
end;
end;
end
else
Writeln(f_log,'Pas de données JSON disponibles');
Finally
FreeAndNil(js);
end;
except
On E : Exception do
Writeln(f_log,'Une erreur est survenue lors du traitement du fichier : ',E.Message);
end;
end;
appelé par :
...
flux:=TFileStream.Create(nf_elements_json, fmopenRead);
try
parseur:=TJSONParser.Create(flux);
try
DoParse(parseur);
finally
FreeAndNil(parseur);
end;
finally
flux.Destroy;
end;
... |
Un code somme toute classique issu des exemples trouvés sur le site.
Si vous avez une idée, je suis preneur...
Merci