Traiter le retour d’un script curl par scénario

Bonjour,

Je me suis inspiré des échanges de ce sujet Traiter le retour d’un script curl - Plugins / Programmation - Communauté Jeedom pour tenter de récupérer des informations en provenance d’un retour de script curl, mais je sèche un peu sur le traitement de mon json.

Voici le script que j’ai écris

$json = system("curl -X 'GET' \
  'https://api.amc.husqvarna.dev/v1/mowers' \
  -H 'accept: application/vnd.api+json' \
  -H 'X-Api-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Authorization-Provider: husqvarna'");
$json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);

if (!empty($json))
{
$findme   = 'data';
$pos = strpos($json, $findme);

	if ($pos === false) 
  	{
    	$scenario->setLog('Erreur de retour de la fonction CURL, la fonction renvoi  : ' .$json);
  	}
  	else
  	{
    	$obj = json_decode($json, TRUE);
    
    	if (json_last_error() === JSON_ERROR_NONE) 
		{
    		$Infos_data = $obj['data'];
         	$scenario->setLog('type : ' . $Infos_data);
         	$scenario->setData('id', $Infos_data);
              
            $data = $obj['data']; //a partir d'ici data me renvoi un [object object]
	        foreach ($Infos_data as $a)
                {
                   $scenario->setData("type".$b, $a['type']);
		   $scenario->setData("id".$b, $a['id']);
                   b;
                }   
             }  
         }
}
       	else 
      	{
        	$scenario->setLog('Erreur json est : ' . $json_errors[json_last_error()]);
}

Jusque là j’obtiens deux variables, que je pourrais exploiter dans des virtuels au besoin, distinctes pour les valeurs ‹ id › et ‹ type ›, ça fonctionne.

J’essaie maintenant d’aller un peu plus loin pour parser mon json en tentant d’extraire les valeurs ‹ name ›, ‹ model ›, ‹ serialNumber › dans le json ci-contre

J’ai fait un essai avec le script suivant (aucune erreur à l’exécution du scénario) mais les valeurs (variables) restent vides. Il doit manquer quelque chose…

$json = system("curl -X 'GET' \
  'https://api.amc.husqvarna.dev/v1/mowers' \
  -H 'accept: application/vnd.api+json' \
  -H 'X-Api-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Authorization-Provider: husqvarna'");
$json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);

if (!empty($json))
{
$findme   = 'data';
$pos = strpos($json, $findme);

	if ($pos === false) 
  	{
    	$scenario->setLog('Erreur de retour de la fonction CURL, la fonction renvoi  : ' .$json);
  	}
  	else
  	{
    	$obj = json_decode($json, TRUE);
    
    	if (json_last_error() === JSON_ERROR_NONE) 
		{
    		$Infos_system = $obj['data'];
         	$scenario->setLog('name : ' . $Infos_system);
         	$scenario->setData('name', $Infos_system);
            
            $Infos_system = $obj['data'];
         	$scenario->setLog('model : ' . $Infos_system);
         	$scenario->setData('model', $Infos_system);
              
            $system = $obj['attributes']['system'];
            //$obj['attributes']['system']; //a partir d'ici data me renvoi un [object object]
	        foreach ($Infos_system as $a)
                {
                   $scenario->setData("name".$b, $a['name']);
		   $scenario->setData("model".$b, $a['model']);
                   b;
                }   
             }  
         }
}
       	else 
      	{
        	$scenario->setLog('Erreur json est : ' . $json_errors[json_last_error()]);
}

Est-ce que quelqu’un peut me donner un conseil ou un tuyau (je ne suis pas développeur).

Merci la communauté.

Joël

Bonjour,

Je suis pas devant un PC pour tester mais tu fait un foreach dans le json ($Infos_system). Tu devrait le faire dans $system

Tu peut aussi tester sans le foreach, en accédant direct a la clé :

$obj['data'][0]['attributes']['system']['name']

EDIT :
Voici le code qui devrait fonctionner, j’ai mis en commentaire la partie setData pour déja vérifier si c’est ok dans les log :

$json = system("curl -X 'GET' \
  'https://api.amc.husqvarna.dev/v1/mowers' \
  -H 'accept: application/vnd.api+json' \
  -H 'X-Api-Key: xxxxxxxxxxx' \
  -H 'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Authorization-Provider: husqvarna'");

$json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);

if (!empty($json))
{
  $findme   = 'data';
  $pos = strpos($json, $findme);
  
  if ($pos === false)
  {
    $scenario->setLog('Erreur de retour de la fonction CURL, la fonction renvoi  : ' .$json);
  }
  else
  {
    $obj = json_decode($json, TRUE);
    $b = 'mower_'; // Préfixe nom de variable
    if (json_last_error() === JSON_ERROR_NONE) 
    {
      $Infos_type = $obj['data'][0]['type'];
      $scenario->setLog('Variable ' . $b . 'type = ' . $Infos_type);
      //$scenario->setData($b . 'type', $Infos_type);
      
      $Infos_id = $obj['data'][0]['id'];
      $scenario->setLog('Variable ' . $b . 'id = ' . $Infos_id);
      //$scenario->setData($b . 'id', $Infos_id);
      
      $Infos_name = $obj['data'][0]['attributes']['system']['name'];
      $scenario->setLog('Variable ' . $b . 'name = ' . $Infos_name);
      //$scenario->setData($b . 'name', $Infos_name);
      
      $Infos_model = $obj['data'][0]['attributes']['system']['model'];
      $scenario->setLog('Variable ' . $b . 'name = ' . $Infos_model);
      //$scenario->setData($b . 'model', $Infos_model);
    }
  }
}
else
{
  $scenario->setLog('Erreur json est : ' . $json_errors[json_last_error()]);
}
1 « J'aime »

Bonjour,

Un grand merci pour l’aide ça fonctionne parfaitement et c’est que je recherchais!
Merci beaucoup.

PS: @iPapy merci d’avoir masqué certains des éléments qui ne sauraient être vus.

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.