Gegenpart zu toJSON() ?

Begonnen von Tobias, 13 August 2018, 08:31:13

Vorheriges Thema - Nächstes Thema

Tobias

Hi,
ich bin nur durch Zufall auf die neue Funktion toJSON() im Forum gestossen. Könnte der Verfasser einen entsprechenden Hinweis in der Commandref eintragen?
Gibt es auch die ReverseFunktion um vom JSON zurück in Skalar/array/hash zu konvertieren?

Hintergrund: in meinem Medialist Modul mache ich es komplizierter, - über toJSON() and fromJSON() würde es einfacher gehen ;)
Da speichere ich alles mögliche als Listen im JSON in den Readings

gruss
tobias
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Thorsten Pferdekaemper

Zitat von: Tobias am 13 August 2018, 08:31:13deine neue Funktion toJSON()
Hi,
wen meinst Du denn? Ich glaube, hier lesen so einige mit...
Gruß,
   Thorsten
FUIP

Tobias

geändert von "deine" in "die". Kommt drauf an wer sich angesprochen fühlt oder weiß ob es die Reverse Funktion gibt ;)
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

betateilchen

#3
Es gibt derzeit keine reverse Funktion.

Und die Funktion toJSON() ist nicht wirklich neu, die ist seit 22.05.2017 in fhem.pl vorhanden. Und ich bin schuld daran  8)

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Aber interessanterweise findet sich in 10_MQTT2_DEVICE.pm die Funktion MQTT2_JSON() die ich für ziemlich genial halte. Die macht aus JSON rekursiv einen Hash mit readingName und Value.

Den kann man dann in einer loop einfach mit setreading() abarbeiten.

Einen entsprechenden Kommentar hatte ich hier schon geschrieben: https://forum.fhem.de/index.php/topic,90145.msg826427.html#msg826427

Zitat
MQTT2_JSON() wünsche ich mir als Funktion json2reading() in fhem.pl und dazu noch CommandSetReadingFromHash()
(oder eine entsprechend modifizierte Variante von CommandSetReading(), die einen hash akzeptiert)

Vielleicht bekommen wir ja eine Mehrheit zusammen, um Rudi zu überzeugen :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ich kann MQTT2_JSON gerne veschieben/umbennen, muss aber Zeit dafuer finden, kann sein, dass erst am WoEnde was wird.
Was ich noch nicht verstehe, wozu man CommandSetReadingFromHash braucht.

betateilchen

Es ist nicht eilig.

Zitat von: rudolfkoenig am 13 August 2018, 14:35:45
Was ich noch nicht verstehe, wozu man CommandSetReadingFromHash braucht.

Man braucht das als Befehl nicht.

Aber es gibt inzwischen eine ganze Reihe von Modulen, die readings aus JSON erzeugen. Und überall ist da etwas mehr oder weniger gut zusammengefrickelt, um diese Transformation zu bewerkstelligen. Wenn man mit MQTT2_JSON() schon eine einfache Möglichkeit hat, einen komplett "fertigen" hash zu erzeugen, wäre es doch prima, wenn man passend dazu noch eine ...setreading() Funktion bekäme, der man einfach diesen hash und einen deviceName vorwirft als Parameter übergibt , die dann alle readings auf einen Schlag erzeugt und dafür beispielsweise readingsBulkUpdate() verwendet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Hallo,

helft mir bitte mal auf die Sprünge: was ist der Unterschied zu encode_json() und decode_json(), die beide in Modulen intensiv benutzt werden?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

toJSON() wurde seinerzeit in fhem.pl implementiert, um keine weiteren perl Libraries installieren zu müssen. Man übergibt ihr einfach irgendeine Variable, egal ob scalar, array oder hash.

Ebenso funktioniert auch das jetzt entstandene MQTT2_JSON() ohne zusätzliche perl Module.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Tobias

ich würde das aber nicht an einem setReading festmachen wollen. Aus einem JSON will man nicht unbedingt direkt Readings erzeugen.
Die generische Version finde ich charmanter und vor allem vielseitiger einsetzbar:
ZitatMan übergibt ihr einfach irgendeine Variable, egal ob scalar, array oder hash.
Und genau das Gegenstück fehlt noch. Den JSON String wieder zurück in ein array, hash oder skalar formatieren.

Bspw. sieht mein Medialist JSON (analog dem FTUI Medialist JSON) folgendermaßen aus. Ist in einem Reading gespeichert und wird je nach Aktion auseinandergepflückt und mit gearbeitet bzw selektive Readings erzeugt
JSON-Object: [ {"Artist":"abc", "Title":"def", "Album":"yxz", "Time":"123", "File":"spotify:track:123456", "Track":"1", "Cover":"https://...." }, {"Artist":"abc", ... ]
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Christoph Morrison

Ich verstehe es vielleicht einfach nur nicht, aber warum nutzt du nicht die Funktionen, die JSON sowieso anbietet? Das Modul wird ja bereits von einigen FHEM-Modulen genutzt und bietet auch eine from_json-Funktion?!

betateilchen

Zitat von: Tobias am 14 August 2018, 07:09:21
genau das Gegenstück fehlt noch. Den JSON String wieder zurück in ein array, hash oder skalar formatieren.

Woher soll das Gegenstück aber wissen bzwl selbst entscheiden, ob Du als Ergebnis eine Variable vom type scalar oder hash oder array haben möchtest?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 14 August 2018, 08:58:10
Woher soll das Gegenstück aber wissen bzwl selbst entscheiden, ob Du als Ergebnis eine Variable vom type scalar oder hash oder array haben möchtest?
m.E. ergibt sich das aus dem JSON, das ein Hash, ein Array oder einen Skalar repräsentiert. decode_json() liefert eine entsprechende Referenz auf ein Hash oder ein Array oder einen Skalar, siehe z.B. https://www.tutorialspoint.com/json/json_perl_example.htm. Die Dereferenzierung macht der Entwickler, der weiß, was er erwartet.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Tobias

ok, dann lass ich es so wie ich es aktuell im Modul auch habe.
my @data = @{JSON::XS->new->decode($playlist)};
[...]
return JSON::XS->new->encode(\@sortdata);
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

betateilchen

Zitat von: Dr. Boris Neubert am 14 August 2018, 10:53:33
m.E. ergibt sich das aus dem JSON, das ein Hash, ein Array oder einen Skalar repräsentiert.

Wir reden glaube aneinander vorbei. Leider bin ich gerade nicht zu Hause, um Dir ein Beispiel zu zeigen, wo das definitiv nicht funktionieren würde.

Aber es steht Dir ja auch frei, weiterhin mit encode_json() und decode_json() zu arbeiten :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!