JSON - Zugriff auf

Ich mal wieder an einem Modul und bekomme das zerlegen des folgenden JSON nicht hin

{
   "data":{
      "SHPLG-1":{
         "url":"http:\/\/firmware.shelly.cloud\/gen1\/SHPLG-1.zip",
         "version":"20210115-103101\/v1.9.4@e2732e05"
      }
   },
   "SHPLG-2":{
      "url":"http:\/\/firmware.shelly.cloud\/gen1\/SHPLG-2.zip",
      "version":"20210115-103101\/v1.9.4@e2732e05"
   }
}

Es geht mir hier um den Zugriff auf die Kategorie oder wie auch immer heist, also das SHPLG-1 / SHPLG-2 … den hinteren Teil bekommen ich, wenn ich durch „data“ itteriere … aber an den „oberen“ Teil komme ich nicht ran.

Wie schaut der Code aus, mit dem du es versucht hast?
Michael

Hier die Beispiele mit denen ich gebastelt habe und auch der Ort wo es her kommt. Vom Prinzip her, will ich anhand der Geräts nach dem richtigen Firmware link schauen. Leider komme ich hier nicht an das Gerät ran.

$url = 'https://api.shelly.cloud/files/firmware';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$data_firmware = curl_exec($ch);
//echo $data_firmware;

$data_firmware = json_decode($data_firmware,true);
//var_dump ($data_firmware);

foreach ($data_firmware as $firmware) {
    //$firmware = json_decode($firmware,true);
    var_dump($firmware);
}
/*
//foreach ($data_firmware["data"] as $firmware) {
foreach ($data_firmware as $firmware) {
    //$firmware = json_decode($firmware,true);
    var_dump($firmware);
}
*/

Hilft dir das Beispiel weiter?

$str = '{
   "data":{
      "SHPLG-1":{
         "url":"http:\/\/firmware.shelly.cloud\/gen1\/SHPLG-1.zip",
         "version":"20210115-103101\/v1.9.4@e2732e05"
      }
   },
   "SHPLG-2":{
      "url":"http:\/\/firmware.shelly.cloud\/gen1\/SHPLG-2.zip",
      "version":"20210115-103101\/v1.9.4@e2732e05"
   }
}';

$result = json_decode($str, true);

print_r($result);

var_dump($result['data']['SHPLG-1']['version']);

ergibt:

Array
(
    [data] => Array
        (
            [SHPLG-1] => Array
                (
                    [url] => http://firmware.shelly.cloud/gen1/SHPLG-1.zip
                    [version] => 20210115-103101/v1.9.4@e2732e05
                )

        )

    [SHPLG-2] => Array
        (
            [url] => http://firmware.shelly.cloud/gen1/SHPLG-2.zip
            [version] => 20210115-103101/v1.9.4@e2732e05
        )

)
string(31) "20210115-103101/v1.9.4@e2732e05"

Also die json_decode in den foreach Blöcken sind zuviel.

Leider nicht wirklich … ich brauche aus dem JSON Zugriff auf die Geräte Typen damit ich diese Vergleichen kann. Also auf SHPLG-1 oder SHPLG-2 als Beispiel.

Anwendung ist, dass ich einen Shelly abfrage nach dem Typ und dann via Webservice die passende Firmware URL suche. Dein Code Schnipsel greift wunderbar auf die Version zu - ich brauche aber den Wert oben drüber unter data:

Dann ist es

var_dump($result['data']['SHPLG-1']);

oder

var_dump($result['data']);

je nachdem was du brauchst.

Dein Beispiel hier stimmte nicht. In Wirklichkeit kommen die Daten so:

{
   "data":{
      "SHPLG-1":{
         "url":"http:\/\/firmware.shelly.cloud\/gen1\/SHPLG-1.zip",
         "version":"20210115-103101\/v1.9.4@e2732e05"
                },
      "SHPLG-2":{
         "url":"http:\/\/firmware.shelly.cloud\/gen1\/SHPLG-2.zip",
         "version":"20210115-103101\/v1.9.4@e2732e05"
                 }
         }
}

Also versuche es mal so

foreach ($data_firmware['data'] as $type=> $firmware) {
    echo $type . PHP_EOL;
    print_r($firmware);
}
1 „Gefällt mir“

Danke … manchmal braucht man eine Inspiration.

Ich frage die Daten jetzt einfach so ab

var_dump($data_firmware['data'][$device]['version']);

Das Device habe ich ja.

Ich kümmere mich auch noch um Deine Wünsche beim Profile-Monitor