httpmod json parsing error. Problem mit JSONP?

Begonnen von FhemPiUser, 23 Februar 2017, 19:13:23

Vorheriges Thema - Nächstes Thema

FhemPiUser

Hallo,

mir ist das JSON Parsing nicht ganz klar. Wenn ich das folgende JSON habe:

warnWetter.loadWarnings({"time":1487871976000,"warnings":{"103353000":[{"start":1487858400000,"end":1487919600000,"regionName":"Kreis Harburg","level":3,"type":1,"altitudeStart":null,"event":"STURMBÖEN","headline":"Amtliche WARNUNG vor STURMBÖEN","description":"Es treten Sturmböen mit Geschwindigkeiten um 80km/h (22m/s, 44kn, Bft 9) anfangs aus südwestlicher, später aus nordwestlicher Richtung auf. In Schauernähe sowie in exponierten Lagen muss mit schweren Sturmböen bis 100 km/h (28m/s, 55kn, Bft 10) gerechnet werden.","altitudeEnd":null,"stateShort":"NS","instruction":"ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel einzelne Ã,,ste herabstürzen. Achten Sie besonders auf herabfallende Gegenstände.","state":"Niedersachsen"}],"105566000":[{"start":1487874600000,"end":1487901600000,"regionName":"Kreis Steinfurt","level":4,"type":1,"altitudeStart":null,"event":"ORKANARTIGE BÖEN","headline":"Amtliche UNWETTERWARNUNG vor ORKANARTIGEN BÖEN","description":"Es treten schwere Sturmböen mit Geschwindigkeiten zwischen 85 km/h (24m/s, 47kn, Bft 9) und 100 km/h (28m/s, 55kn, Bft 10) anfangs aus südwestlicher, später aus westlicher Richtung auf. In Schauernähe sowie in exponierten Lagen muss mit orkanartigen Böen um 110 km/h (31m/s, 60kn, Bft 11) gerechnet werden.","altitudeEnd":null,"stateShort":"NRW","instruction":"ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel Bäume entwurzelt und Dächer beschädigt werden. Achten Sie besonders auf herabstürzende Ã,,ste, Dachziegel oder Gegenstände. Schließen Sie alle Fenster und Türen! Sichern Sie Gegenstände im Freien! Halten Sie insbesondere Abstand von Gebäuden, Bäumen, Gerüsten und Hochspannungsleitungen. Vermeiden Sie möglichst den Aufenthalt im Freien!","state":"Nordrhein-Westfalen"},{"start":1487854080000,"end":1487919600000,"regionName":"Kreis Steinfurt","level":3,"type":1,"altitudeStart":null,"event":"STURMBÖEN","headline":"Amtliche WARNUNG vor STURMBÖEN","description":"Es treten Sturmböen mit Geschwindigkeiten um 80km/h (22m/s, 44kn, Bft 9) anfangs aus südwestlicher, später aus westlicher Richtung auf. In Schauernähe sowie in exponierten Lagen muss mit schweren Sturmböen bis 100 km/h (28m/s, 55kn, Bft 10) gerechnet werden.","altitudeEnd":null,"stateShort":"NRW","instruction":"ACHTUNG! Hinweis auf mögliche Gefahren: Es können zum Beispiel einzelne Ã,,ste herabstürzen. Achten Sie besonders auf herabfallende Gegenstände.","state":"Nordrhein-Westfalen"}],...

(Komplettes JSON siehe Quelle: http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json)

Wie kann ich nun den Wert der Variable "headline" bekommen, die einer bestimmten Region zugeordnet ist? (Eigentlich will ich alle headlines zu einer Region bekommen, denn es kann mehrere geben. Ist das mit Modelist möglich?)

Habe folgendes probiert, aber da kommt kein Reading headline


attr httmod get01JSON warnWetter.loadWarnings_warnings_103353000_headline
attr httmod get01Name test
attr httmod getData {"get" :["headline"]}
attr httmod getHeader1 Content-Type: application/json
attr httmod getHeader2 Accept: */*
attr httmod getURL http://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json


Im fhem log mit verbose 5 wird angezeigt, dass das JSON ankommt, aber dann kommt folgende Fehlermeldung:

2017.02.23 19:10:00.566 3: httpmod: error while parsing JSON data: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "warnWetter.loadWarni...") at (eval 65075) line 1.


Jemand eine Idee?

Könnte es daran liegen, dass es JSONP ist und httpmod das nicht unterstützt? Falls ja, kann ich mit httpmod irgendwie den Präfix "warnWetter.loadWarnings(" und am Ende das " );" entfernen, dann wäre es reines JSON...


StefanStrobel

Hallo,

HTTPMOD verwendet libjson-perl und das erwartet JSON, nicht JSONP.
Im konkreten Fall wäre es aber recht einfach die Daten per Regex zu extrahieren.

Gruß
    Stefan

FhemPiUser

Gibt es denn ein Attribut von httpmod für Preprocessing, sodass ich per regex aus dem JSONP ein JSON machen kann und dann normal den JSON parser nutzen kann?


StefanStrobel

Bisher nicht. Sollte aber kein größeres Problem sein so etwas einzubauen.

Gruß
    Stefan

FhemPiUser

#4
ok, aber wenns per regex auch geht reicht es auch.

Ich habe es geschafft die headlines einer Region zu finden mit

attr dev get01Regex <regionsID>.+?headline":"(.*?)"

und regOpt g


FhemPiUser

ist leider doch noch nicht gelöst, das die regex noch nicht mit mehreren Ereignissen/headlines einer region umgehen kann. Ich mache dafür einen neuen Thread auf...

Rudibarani

#6
Hallo Stefan,
ich hänge gerade an einem ähnlichen Problem und bin auf diesen - leider alten - Thread gestoßen.

Meine Lupus Alarmanlage gibt in der Device Liste eine nicht 100% JSON-konforme Rückmeldung mit fehlerhaften Tabs. Diese würde ich gerne über eine Regex korrigieren, bevor ich das JSON an extractAllJSON übergebe.

Zitat von: StefanStrobel am 23 Februar 2017, 21:41:55
Bisher nicht. Sollte aber kein größeres Problem sein so etwas einzubauen.

Gruß
    Stefan

Gibt es inzwischen so eine Möglichkeit für ein Preprocessing bzw. wie kann man sowas implementieren? Ich bin leider eher ein copy&paste Laie - aber lernfähig.

Viele Grüße
Phillip

StefanStrobel

Hallo Philip,

probier doch mal die angehängte Version zum Testen aus.
Da gibt es ein neues Attribut preProcessRegex. Wenn Du das auf so etwas wie s/foo/bar/g setzt, kannst Du damit den gelesenen Puffer manipulieren, bevor er weiter verarbeitet wird.
Zur Fehlersuche sollte verbose auf 5 gesetzt werden, dann wird der geänderte Puffer geloggt.

Gruss
   Stefan

Rudibarani

Lieber Stefan,

absolut spitze!!! Hab bei unserer Lupusec Alarmanlage nun folgendes eingetragen (vielleicht hilft das ja auch anderen hier, ihre Anlage in FHEM einzubinden)
attr Alarmanlage_SmartHome preProcessRegex s/\t//g
attr Alarmanlage_SmartHome extractAllJSON 1


und wie durch Zauberhand tauchen nun alle Sensoren und Aktoren in der Übersicht auf. Ganz herzlichen Dank für Deine Hilfe!

Wünsche Dir ein schönes Wochenende
Phillip



Rudibarani

Lieber Stefan,

ich wollte nun anfangen, die sehr lange Liste von Reading zu verarbeiten und aufzuräumen. Dabei bin ich auf folgendes Problem gestoßen:
Kann ich auch eine URL, die ich als get01URL in einem HTTPMPOD-Aufruf einbinde und durch preProcessRegex korrigieren lassen? An welcher Stelle müsste ich dann den numerischen Indikator setzen?

Vielen Dank
Phillip

StefanStrobel

Hallo,

die preProcessRegex gilt für das ganze HTTPMOD-Device, in dem das Attribut gesetzt ist, also auch für alle einzelnen gets.

Gruss
   Stefan

Rudibarani

Lieber Stefan,

dann mache ich da wohl was falsch. Bei mir klappt es für die Haupt-URL, bislang aber nicht, wenn ich über getXXURL weitere URLs einbinde. Dann wird mir der Buffer auch unkorrigiert im Device auf der Webseite angezeigt.

Viele Grüße
Phillip

StefanStrobel

Hallo Phillip,

dann solltest Du mal verbose für Dein Gerät auf 5 setzen und ins Log schauen.
Die preProcessRegex wird an zentraler Stelle in der Read-Funktion aufgerufen. Da kommt eigentlich nichts drum herum.
Im Log sollte dann auch ein Eintrag a la Read - body after preProcessRegex: erscheinen...

Gruss
   Stefan

Rudibarani

Lieber Stefan,

ich habe mir die neue 98_HTTPMOD.pm-Datei bei einem Update wohl aus Versehen durch die reguläre Datei ersetzt... Nachdem ich wieder Deine veränderte Datei eingebaut habe, läuft es wieder :)
Muss ich da dauerhaft aufpassen, oder wird es die preProcessRegex-Funktion viellecht auch in das reguläre Update schaffen?

Das andere Problem mit den getXXURL habe ich so gelöst, dass ich die Unter-URL in ein neues Device ausgelagert habe. Dann läuft es ohne Probleme.

Vielen Dank nochmal!
Phillip


StefanStrobel

Hallo,

das Feature ist eingecheckt und sollte inzwischen per Update verteilt werden.

Gruß
    Stefan