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);
}
*/
bumaas
8. April 2023 um 08:50
4
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:
bumaas
8. April 2023 um 12:29
6
Dann ist es
var_dump($result['data']['SHPLG-1']);
oder
var_dump($result['data']);
je nachdem was du brauchst.
BommelPommel:
{
"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"
}
}
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