Parse JSON

Bonjour,

J’ai entrepris de récupérer l’agenda de mon fils sur jeedom. Le but ultime est d’avoir l’heure du réveil qui se calcul en fonction du premier cours :wink:

J’ai identifé l’API et la syntaxe pour récupérer l’agenda. Dans le meilleur des mondes cela fonctionne.
J’ai le fichier JSON

Par exemple

{
  "week": {
    "lundi": [
      {
        "date": "28/09/2020",
        "subject": "xxxxxx",
        "start": "13:00",
        "end": "17:00",
        "professor": "yyyyy",
        "room": "N213(HEP Nantes)",
        "weekday": "lundi",
        "bts": false,
        "presence": true
      },
      {
        "date": "28/09/2020",
        "subject": "xxxxxx",
        "start": "08:00",
        "end": "12:00",
        "professor": "yyyy",
        "room": "N213(HEP Nantes)",
        "weekday": "lundi",
        "bts": false,
        "presence": true
      }
    ],

Ce qui donne

Et j’ai trouvé quelques tuto pour commencer le script

// Step 1: Recuperation du contenu du fichier 
$api = "https://api-calendar.calendz.app/v1/week/:10-02-2020?firstname=xxx&lastname=xxxx";
$json = file_get_contents($api);

$scenario->setlog('-----RAW----------');
$scenario->setlog($json);
$scenario->setlog('');
// Step 2: Decodage du JSON et recuperation des infos souhaitees
$jsonData = json_decode($json,true);

$scenario->setlog('-------DECODE----------');
$scenario->setlog($jsonData);
$scenario->setlog('');

if(is_array($jsonData)){
$scenario->setlog('---IMPORT SUCCESS----');
$scenario->setlog('');
 
   
foreach ($jsonData['week'] as $jsonKey) {
  $scenario->setlog('---FOUND WEEK----');
  
}
}

Les logs

2020-12-29 23:40:24][SCENARIO] Start : Scenario lance manuellement.
[2020-12-29 23:40:25][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-12-29 23:40:25][SCENARIO] Exécution d'un bloc code
[2020-12-29 23:40:25][SCENARIO] -----RAW----------
[2020-12-29 23:40:25][SCENARIO] {"week":{"lundi":[{"date":"28/09/2020","subject":"xxxxxxxxxxxxxxxxxxx"bts":false,"presence":true}]},"weekNumber":40,"scrappedToday":"true"}
[2020-12-29 23:40:25][SCENARIO]
[2020-12-29 23:40:25][SCENARIO] -------DECODE----------
[2020-12-29 23:40:25][SCENARIO] Array
[2020-12-29 23:40:25][SCENARIO]
[2020-12-29 23:40:25][SCENARIO] ---IMPORT SUCCESS----
[2020-12-29 23:40:25][SCENARIO]
[2020-12-29 23:40:25][SCENARIO] ---FOUND WEEK----
[2020-12-29 23:40:25][SCENARIO] ---FOUND WEEK----
[2020-12-29 23:40:25][SCENARIO] ---FOUND WEEK----
[2020-12-29 23:40:25][SCENARIO] ---FOUND WEEK----
[2020-12-29 23:40:25][SCENARIO] ---FOUND WEEK----
[2020-12-29 23:40:25][SCENARIO] Fin correcte du scénario

Comment récuperer un jour complet?
Merci d’avance de votre support

Bonjour
A ce que je peux voir tu as un résultat de 4 semaine.
Il faut encore parser chaque ‹ week › pour avoir les jours puis chaque jour pour avoir les cours …
Vu que les cours n’ont pas l’air dans l’ordre le premier commençant a 13 heure le deuxième à 8 heure tu peux aussi trier le tableau des jours.
https://www.zendevs.xyz/comment-trier-les-tableaux-en-php/

1 « J'aime »

Merci @PanoLyon,

J’arrive bien à lire, qu’il y a 5 jours dans la semaine choisie, puis comment faire pour descendre au niveau du jour ?

Je ne suis pas spécialiste mais dans ta boucle :

soit tu sors le $jsonKey['lundi']$jsonKey['mardi'] sinon tu peux créer un autre for each

a savoir que $jsonKey[‹ lundi ›][0] contiendra le rendez-vous de 13:00

1 « J'aime »

Merci @PanoLyon :pray:

Je ai pas eu un grand succés avec $jsonKey['lundi']$jsonKey['mardi'], mais trouvé un code qui fonctionne, voici le code

// Step 1: Recuperation du contenu du fichier 
$api = "https://api-calendar.calendz.app/v1/week/:10-02-2020?firstname=xxxxx&lastname=xxxxx";
$json = file_get_contents($api);

$scenario->setlog('-----RAW----------');
$scenario->setlog($json);
$scenario->setlog('');
// Step 2: Decodage du JSON et recuperation des infos souhaitees
$jsonData = json_decode($json,true);
$scenario->setlog('-----DECODE-----');
$scenario->setlog('');

if(is_array($jsonData)){
$scenario->setlog('-----IMPORT SUCCESS-----');
$scenario->setlog('');

 
foreach ($jsonData['week'] as $value=>$jsonKey) {
$scenario->setlog('-----DAY : '.$value.'-----');
  
foreach ($jsonKey as $value2=>$jsonKey2) {
$scenario->setlog('-----ENTRY : '.$value2.'-----');
$scenario->setlog('Date           : '.$jsonKey2['date']);
$scenario->setlog('Start~End  :'.$jsonKey2['start'].'~'.$jsonKey2['end']);
$scenario->setlog('Sujet          : '.$jsonKey2['subject']);
$scenario->setlog('Professeur : '.$jsonKey2['professor']);
$scenario->setlog('Room         : '.$jsonKey2['room']);
//$scenario->setlog('Weekday    :'.$jsonKey2['weekday']);
//$scenario->setlog('Presence :'.$jsonKey2['presence']);
//$scenario->setlog('BTS :'.$jsonKey2['bts']);
$scenario->setlog('');
}
}
$scenario->setlog('weekNumber    :'.$jsonData['weekNumber']);
$scenario->setlog('scrappedToday :'.$jsonData['scrappedToday']);
$scenario->setlog('');  
}

Le résultat est satisfaisant

[2020-12-30 09:51:11][SCENARIO] Start : Scenario lance manuellement.
[2020-12-30 09:51:11][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-12-30 09:51:12][SCENARIO] Exécution d'un bloc code
[2020-12-30 09:51:12][SCENARIO] -----RAW----------
[2020-12-30 09:51:12][SCENARIO] {"week":{"lundi":[{"date":"28/09/2020","suxxxxxxxxxxedToday":false}
[2020-12-30 09:51:12][SCENARIO]
[2020-12-30 09:51:12][SCENARIO] -----DECODE-----
[2020-12-30 09:51:12][SCENARIO]
[2020-12-30 09:51:12][SCENARIO] -----IMPORT SUCCESS-----
[2020-12-30 09:51:12][SCENARIO]
[2020-12-30 09:51:12][SCENARIO] -----DAY : lundi-----
[2020-12-30 09:51:12][SCENARIO] -----ENTRY : 0-----
[2020-12-30 09:51:12][SCENARIO] Date           : 28/09/2020
[2020-12-30 09:51:12][SCENARIO] Start~End  :13:00~17:00
[2020-12-30 09:51:12][SCENARIO] Sujet          : Assssss
[2020-12-30 09:51:12][SCENARIO] Professeur : bddddddh
[2020-12-30 09:51:12][SCENARIO] Room         : N213(HEP Nantes)
[2020-12-30 09:51:12][SCENARIO]
[2020-12-30 09:51:12][SCENARIO] -----ENTRY : 1-----
[2020-12-30 09:51:12][SCENARIO] Date           : 28/09/2020
[2020-12-30 09:51:12][SCENARIO] Start~End  :08:00~12:00
[2020-12-30 09:51:12][SCENARIO] Sujet          : xxxxxxx
[2020-12-30 09:51:12][SCENARIO] Professeur : ressssssric
[2020-12-30 09:51:12][SCENARIO] Room         : N213(HEP Nantes)
[2020-12-30 09:51:12][SCENARIO]

Maintenant, il faut que je récupére la première heure de cours du jour.
Je vais m’attaquer au tuto que tu m’as envoyé pour trier

Oui il faut attention entre clef et valeur :zipper_mouth_face: mes excuses, des explications https://phpsources.net/tutoriel-boucle-for-each.htm

1 « J'aime »

@PanoLyon,

Je lutte avec le trie, car si je veux trier par heure, $jsonKey2[‹ start ›] est dans la boucle et avant, je ne l’ai pas.

peux tu m’envoyer ton json en mp ?

1 « J'aime »

merci @PanoLyon, je t’ai transmis le Json en MP

Oui j’ai vu et avancé !
j’ai eu un souci avec le tri alors j’ai ajouté un tableau à une dimension pour le tri.
Ça fonctionne, je ne suis pas un spécialiste alors il y a surement plus propre …

[2020-12-30 12:44:15][SCENARIO] -----DAY : lundi-----
[2020-12-30 12:44:15][SCENARIO] Pan-- Verification de unset tableau0
[2020-12-30 12:44:15][SCENARIO] -----ENTRY : 0-----
[2020-12-30 12:44:15][SCENARIO] Pan:-- tab           :    1
[2020-12-30 12:44:15][SCENARIO] Date           : 28/09/2020
[2020-12-30 12:44:15][SCENARIO] Start~End  :13:00~17:00
[2020-12-30 12:44:15][SCENARIO] Sujet          : Algorithmique&langageC
[2020-12-30 12:44:15][SCENARIO] Professeur : brauxmathias
[2020-12-30 12:44:15][SCENARIO] Room         : N213(HEPNantes)
[2020-12-30 12:44:15][SCENARIO]
[2020-12-30 12:44:15][SCENARIO] -----ENTRY : 1-----
[2020-12-30 12:44:15][SCENARIO] Pan:-- tab           :    2
[2020-12-30 12:44:15][SCENARIO] Date           : 28/09/2020
[2020-12-30 12:44:15][SCENARIO] Start~End  :08:00~12:00
[2020-12-30 12:44:15][SCENARIO] Sujet          : Architecturematérielle&rése
[2020-12-30 12:44:15][SCENARIO] Professeur : reinoldfrédéric
[2020-12-30 12:44:15][SCENARIO] Room         : N213(HEPNantes)
[2020-12-30 12:44:15][SCENARIO]
[2020-12-30 12:44:15][SCENARIO]
[2020-12-30 12:44:15][SCENARIO]
[2020-12-30 12:44:15][SCENARIO] Pan:-- 			tab0 heure de début des cours : 08:00

Retour du code en MP tiens moi au courant

1 « J'aime »

Bonjour,

J’ai dû modifier le code pour ne récupérer que 1 jour et plus la semaine compléte.
La variable jeedom « alarm_a » est mise à jour avec l’heure du premier cours - 1h pour le reveil dans jeedom :wink:

// Step 1: Recuperation du contenu du fichier 
$alarm_hours=99;
$alarm_minutes=99;
$scenario->setData('alarm_a',$alarm_hours.$alarm_minutes);

$date_jour= date("m-d-y");
//force la date pour des tests
//$date_jour= "09-28-20";

$scenario->setlog('Date : '.$date_jour);

$api = "https://api-calendar.calendz.app/v1/day/:".$date_jour."?firstname=xxxxx&lastname=xxxxxx";
$scenario->setlog('Api : '.$api);
$json = file_get_contents($api);

//$scenario->setlog('-----RAW----------');
//$scenario->setlog('RAW : '.$json);
//$scenario->setlog('');
//Step 2: Decodage du JSON et recuperation des infos souhaitees
$jsonData = json_decode($json,true);
//$scenario->setlog('-----DECODE-----');
//$scenario->setlog('');

if(is_array($jsonData)){
$scenario->setlog('-----IMPORT SUCCESS-----');
$scenario->setlog('');

 
foreach ($jsonData as $value=>$jsonKey) {
$scenario->setlog('-------'.strtoupper($value).'-------');
//$jsonTemp=json_encode($jsonKey);   
//$scenario->setlog('RAW : '.$jsonTemp);
//$scenario->setlog('');
 
//trie par horaire ascendant  
array_multisort(array_column($jsonKey, 'start'),SORT_ASC,$jsonKey);

//extrait le premier cours de la journée  
$jsonKey_top=array_slice($jsonKey, 0, 1);  
//$jsonTemp=json_encode($jsonKey_top);   
//$scenario->setlog('**** RAW_TEMP : '.$jsonTemp);
//$scenario->setlog('');

$scenario->setlog('------------1er cours-----------');  
foreach ($jsonKey_top as $value2=>$jsonKey2) {
$scenario->setlog('------------#'.$value2.'-----------');
//$jsonTemp=json_encode($jsonKey2);   
//$scenario->setlog('RAW : '.$jsonTemp);
$scenario->setlog('Date          : '.$jsonKey2['date']);
$scenario->setlog('Start~End  :'.$jsonKey2['start'].'~'.$jsonKey2['end']);
$scenario->setlog('Sujet          : '.$jsonKey2['subject']);
$scenario->setlog('Professeur : '.$jsonKey2['professor']);
$scenario->setlog('Room         : '.$jsonKey2['room']); 

// alarm  
$parsed = date_parse($jsonKey2['start']);
$time_seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60 + $parsed['second'];
$alarm_clock_seconds=$time_seconds-3600;

$alarm_hours=gmdate("H",$alarm_clock_seconds); 
$alarm_minutes=gmdate("i",$alarm_clock_seconds);   
$scenario->setlog('wake-up     : '.$alarm_hours.":".$alarm_minutes);
$scenario->setData('alarm_a',$alarm_hours.$alarm_minutes);
  
//$scenario->setlog('Weekday    :'.$jsonKey2['weekday']);
//$scenario->setlog('Presence :'.$jsonKey2['presence']);
//$scenario->setlog('BTS :'.$jsonKey2['bts']);
$scenario->setlog('');
 
}
  
$scenario->setlog('------------tous les cours-----------');  
  
foreach ($jsonKey as $value2=>$jsonKey2) {
$scenario->setlog('------------#'.$value2.'-----------');
//$jsonTemp=json_encode($jsonKey2);   
//$scenario->setlog('RAW : '.$jsonTemp);
  
$scenario->setlog('Date           : '.$jsonKey2['date']);
$scenario->setlog('Start~End  :'.$jsonKey2['start'].'~'.$jsonKey2['end']);
$scenario->setlog('Sujet          : '.$jsonKey2['subject']);
$scenario->setlog('Professeur : '.$jsonKey2['professor']);
$scenario->setlog('Room         : '.$jsonKey2['room']);
//$scenario->setlog('Weekday    :'.$jsonKey2['weekday']);
//$scenario->setlog('Presence :'.$jsonKey2['presence']);
//$scenario->setlog('BTS :'.$jsonKey2['bts']);
$scenario->setlog('');
}
   
}
//$scenario->setlog('weekNumber    :'.$jsonData['weekNumber']);
//$scenario->setlog('scrappedToday :'.$jsonData['scrappedToday']);
$scenario->setlog('');  
}
1 « J'aime »