stdClass Object mit variablem fehlerfrei zuordnen - Anfänger

Hallo Gemeinde,

könnt Ihr mir bitte mit einem Stichwort oder einem kurzen Beispiel weiterhelfen?

Ich erhalte über eine offene JSON API folgendes Object zurück:

stdClass Object
(
    [successful] => 1
    [status] => stdClass Object
        (
            [status] => 0
            [duration] => 15186
            [mode] => 0
            [battery] => 100
            [hours] => 110
        )

    [timer] => stdClass Object
        (
            [status] => 2
            [next] => stdClass Object
                (
                    [date] => 27.07.2016
                    [time] => 06:00:00
                    [unix] => 1469599200
                )

        )

    [wlan] => stdClass Object
        (
            [signal] => -76
        )

)

Die Zuordnung, Formatierung und Ausgabe ist eigentlich :stuck_out_tongue: kein Problem, aber der Inhalt ist leider nicht statisch und führt bei einer steifen Zuordnung…

SetValue(16140 /*[Geräte\Gardena R80li (Robonect H30x)\Betriebsart]*/, 	$obj->status->mode);

… zu diversen Meldungen im System. Funktioniert zwar, aber ist nicht wirklich eine Lösung.

Würde mich über das richtige Suchwort oder ein kurzes Beispiel sehr freuen!

Sollte das Skript die Funktionsfähigkeit erreichen werde ich es natürlich hier veröffentlichen. (Anbindung Gardena R80Li)

Grüße und Danke!

Micha

Hier mal ein paar Stichwort:

PHP: property_exists - Manual
PHP: foreach - Manual

            foreach ($obj as $propertyname => $value)
            {
           // $propertyname = Name
           // $value = Inhalt oder weiteres Objekt
            }

Alternativ bei json_decode (Manual) den zweiten Parameter mit true übergeben und du bekommst ein Array.
Dort kannst du dann z.B. mit isset (Manual) oder mit array_keys (Manual) arbeiten.

Michael

Perfekt vielen Dank! Das war mir eine große Hilfe! -> Skript funktioniert fehlerfrei :slight_smile:

Hab den Weg über das Array genommen und dann per

if (array_key_exists(‚status‘, $array))
{

}

geprüft ob der „Key“ auch wirklich in der Antwort steckt.

Formatiere heute Abend noch die Ausgabe und poste dann das ganze Skript.

Grüße

Anbei die aktuelle Version - Funktioniert jetzt fehlerfrei und ohne Meldungen.


<?
			// Abfrage API-Schnittstelle
				$json 		= file_get_contents('http://192.168.178.140/json?cmd=status');
				
			// Umwandlung object --> array
				$array 		= json_decode($json, true);
				
			// Inhalt prüfen, formatieren und ausgeben
				if(isset($array['status']['duration']))
					{
					SetValue(33259 /*[Geräte\Gardena R80li (Robonect H30x)\Letzter Statuswechsel]*/,			date("H:i:s", $array['status']['duration'])	);
					}
					
				if(isset($array['status']['status']))
					{
					SetValue(36543 /*[Geräte\Gardena R80li (Robonect H30x)\Status]*/, 							$array['status']['status']							);
					}
					
				if(isset($array['status']['mode']))
					{
					SetValue(16140 /*[Geräte\Gardena R80li (Robonect H30x)\Betriebsart]*/, 						$array ['status']['mode']							);
					}
					
				if(isset($array['status']['battery']))
					{
					SetValue(47520 /*[Geräte\Gardena R80li (Robonect H30x)\Akkukapazität]*/, 					$array ['status']['battery']						);
					}
					
				if(isset($array['status']['hours']))
					{
					SetValue(44830 /*[Geräte\Gardena R80li (Robonect H30x)\Betriebsstunden]*/, 				$array ['status']['hours']							);
					}

				if(isset($array['wlan']['signal']))
					{
					SetValue(44163 /*[Geräte\Gardena R80li (Robonect H30x)\WiFi Signal]*/, 						$array ['wlan']['signal']							);
					}
					
				if(isset($array['timer']['status']))
					{
					SetValue(10708 /*[Geräte\Gardena R80li (Robonect H30x)\Timer]*/, 								$array ['timer']['status']							);
					}

				if(isset($array['timer']['next']['date']))
					{
					SetValue(36436 /*[Geräte\Gardena R80li (Robonect H30x)\Timer - Startdatum]*/, 			$array ['timer']['next']['date']					);
					}
					
				if(isset($array['timer']['next']['time']))
					{
					SetValue(12370 /*[Geräte\Gardena R80li (Robonect H30x)\Timer - Startzeit]*/, 				$array ['timer']['next']['time']					);
					}

				if(isset($array['error']['date']))
					{
 					SetValue(24084 /*[Geräte\Gardena R80li (Robonect H30x)\error/date]*/, 						$array ['error']['date']							);
					}
					
				if(isset($array['error']['time']))
					{
 					SetValue(59928 /*[Geräte\Gardena R80li (Robonect H30x)\error/time]*/, 						$array ['error']['time']							);
					}
					
				if(isset($array['error']['error_code']))
					{
 					SetValue(55753 /*[Geräte\Gardena R80li (Robonect H30x)\error/error_code]*/, 				$array ['error']['error_code']					);
					}
					
				if(isset($array['error']['error_message']))
					{
 					SetValue(44698 /*[Geräte\Gardena R80li (Robonect H30x)\error/error_message]*/, 			$array ['error']['error_message']				);
					}
					
?>