FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: igami am 09 Mai 2017, 10:21:15

Titel: (gelöst) json überprüfen
Beitrag von: igami am 09 Mai 2017, 10:21:15
In meinem Modul LuftdatenInfo bekomme ich ein JSON von einer HTTP abfrage zurück. Manchmal jedoch nicht und dann bleibt FHEM hängen weil ich das nicht überprüfe.

Wie könnte so eine Überprüfung aussehen ob "$data = decode_json($data);"  einen Fehler auswirft?
Titel: Antw:json überprüfen
Beitrag von: rudolfkoenig am 09 Mai 2017, 10:23:56
Wieso bleibt FHEM haengen, wenn die Daten leer/kaputt sind?
Verwendest du HttpUtils_NonblockingGet?
Titel: Antw:json überprüfen
Beitrag von: justme1968 am 09 Mai 2017, 10:43:20
das JSON modul liefert leider keine fehler sondern beendet sich komplett wenn es fehler gibt.

deshalb sollte man das ganze immer nur mit einem eval aufrufen:my $obj = eval { decode_json($json) };und dananach $@ prüfen.

gruss
  andre
Titel: Antw:json überprüfen
Beitrag von: herrmannj am 09 Mai 2017, 10:51:23
volle Zustimmung!

Ist sogar noch schlimmer, es gibt mittlerweile verschiedene perl JSON Modul (und versionen). Die behandeln dann auch UTF8 noch unterschiedlich. Wenn da was drin ist was die nicht wollen crashen die ohne jede Vorwarnung.

Abstrakt: JSON immer(!) im eval und mit allem rechnen.

vg
joerg
Titel: Antw:json überprüfen
Beitrag von: igami am 09 Mai 2017, 12:03:52
Zitat von: rudolfkoenig am 09 Mai 2017, 10:23:56
Wieso bleibt FHEM haengen, wenn die Daten leer/kaputt sind?
Verwendest du HttpUtils_NonblockingGet?
Warum es das macht weiß ich nicht. HttpUtils_NonblockingGet wird verwendet.
Für den Fehler siehe:
Zitat von: Frank_Huber am 07 Mai 2017, 21:46:33
Nur der Vollständigkeit halber:

2017.05.07 18:20:46 2: LuftdatenInfo (Luftdaten_Wolfartsweiher) - error while request: read from http://api.luftdaten.info:80 timed out
malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "<!DOCTYPE HTML PUBLI...") at ./FHEM/59_LuftdatenInfo.pm line 265.


Bei 3 fhem crashes heute die letzte log Zeile.

Gesendet von meinem S3_32 mit Tapatalk

Zitat von: justme1968 am 09 Mai 2017, 10:43:20
das JSON modul liefert leider keine fehler sondern beendet sich komplett wenn es fehler gibt.

deshalb sollte man das ganze immer nur mit einem eval aufrufen:my $obj = eval { decode_json($json) };und dananach $@ prüfen.

gruss
  andre
Vielen dank, kann ich das dann wie folgt umsetzen?

$data = eval{decode_json($data)};

if($@){
  Log3($SELF, 2, "$TYPE ($SELF) - error while request: $@");
 
  readingsSingleUpdate($hash, "state", "error", 1);

  return;
}
Titel: Antw:json überprüfen
Beitrag von: justme1968 am 09 Mai 2017, 12:06:42
ja. genau.
Titel: Antw:json überprüfen
Beitrag von: rudolfkoenig am 09 Mai 2017, 12:54:23
ZitatBei 3 fhem crashes heute die letzte log Zeile.
Das klingt aber nicht nach "haengen". Die Unterschiedung ist mir wichtig, da ich mich fuer Haenger eher zustaendig fuehle, als fuer Crashes :)
Titel: Antw:json überprüfen
Beitrag von: igami am 09 Mai 2017, 13:00:16
Zitat von: rudolfkoenig am 09 Mai 2017, 12:54:23
Das klingt aber nicht nach "haengen". Die Unterschiedung ist mir wichtig, da ich mich fuer Haenger eher zustaendig fuehle, als fuer Crashes :)
Okay, mein Fehler: FHEM stürzt ab und ist danach nicht mehr zu erreichen. Ob der FHEM Prozess beendet wurde habe ich nicht überprüft.
Titel: Antw:json überprüfen
Beitrag von: igami am 09 Mai 2017, 13:07:48
Zitat von: igami am 09 Mai 2017, 13:00:16
Okay, mein Fehler: FHEM stürzt ab und ist danach nicht mehr zu erreichen. Ob der FHEM Prozess beendet wurde habe ich nicht überprüft.
Habe grade von Frank die Nachricht bekommen, dass der Prozess beendet wurde.
Titel: Antw:json überprüfen
Beitrag von: herrmannj am 09 Mai 2017, 13:09:07
ja klar. json crashed im modul und reist fhem komplett mit.
Titel: Antw:(gelöst) json überprüfen
Beitrag von: Markus M. am 16 Mai 2017, 13:01:02
Danke für das Beispiel, hab's in meinen Modulen gleich mal übernommen.