FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Tobias am 13 August 2018, 08:31:13

Titel: Gegenpart zu toJSON() ?
Beitrag von: Tobias am 13 August 2018, 08:31:13
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
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: Thorsten Pferdekaemper am 13 August 2018, 10:34:08
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
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: Tobias am 13 August 2018, 12:24:32
geändert von "deine" in "die". Kommt drauf an wer sich angesprochen fühlt oder weiß ob es die Reverse Funktion gibt ;)
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: betateilchen am 13 August 2018, 14:20:00
Es gibt derzeit keine reverse Funktion.

Und die Funktion toJSON() ist nicht wirklich neu, die ist seit 22.05.2017 (https://forum.fhem.de/index.php/topic,72270.msg638885.html#msg638885) in fhem.pl vorhanden. Und ich bin schuld daran  8)

Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: betateilchen am 13 August 2018, 14:29:18
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 :)
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: rudolfkoenig am 13 August 2018, 14:35:45
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.
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: betateilchen am 13 August 2018, 14:46:46
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.
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: Dr. Boris Neubert am 13 August 2018, 17:53:13
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
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: betateilchen am 13 August 2018, 18:07:38
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.
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: Tobias am 14 August 2018, 07:09:21
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", ... ]
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: Christoph Morrison am 14 August 2018, 08:51:20
Ich verstehe es vielleicht einfach nur nicht, aber warum nutzt du nicht die Funktionen, die JSON (https://metacpan.org/pod/JSON) sowieso anbietet? Das Modul wird ja bereits von einigen FHEM-Modulen genutzt und bietet auch eine from_json (https://metacpan.org/pod/JSON#from_json)-Funktion?!
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: betateilchen am 14 August 2018, 08:58:10
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?
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: Dr. Boris Neubert am 14 August 2018, 10:53:33
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 (https://www.tutorialspoint.com/json/json_perl_example.htm). Die Dereferenzierung macht der Entwickler, der weiß, was er erwartet.
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: Tobias am 14 August 2018, 11:13:02
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);
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: betateilchen am 14 August 2018, 13:43:50
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 :)
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: rudolfkoenig am 14 August 2018, 22:21:04
Habe MQTT2_JSON als json2nameValue in fhem.pl geschoben. Achtung, das is _NICHT_ der Gegenpart zu toJSON, da es aus einer tiefen Hierarchie eine flache baut, und keine Ahnung von Arrays hat.
Weiterhin gibt es eine json2reading($device, $json) Funktion, um die Daten als reading zu speichern.
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: betateilchen am 15 August 2018, 10:30:27
Danke.

Zitat von: rudolfkoenig am 14 August 2018, 22:21:04
Achtung, das ist _NICHT_ der Gegenpart zu toJSON, da es aus einer tiefen Hierarchie eine flache baut, und keine Ahnung von Arrays hat.

Das dürfte in einer Vielzahl der Anwendungsfälle trotzdem völlig ausreichend sein.
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: Tobias am 16 August 2018, 12:48:36
mal vorsichtig nachfragen: steht das in irgendeiner Doku? Commandref, Development-wiki,...?
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: CoolTux am 16 August 2018, 12:51:08
Zitat von: Tobias am 16 August 2018, 12:48:36
mal vorsichtig nachfragen: steht das in irgendeiner Doku? Commandref, Development-wiki,...?

Es steht in der fhem.pl. Sicherlich zu gegebener Zeit auch im Wiki wenn noch nicht vorhanden.
Titel: Antw:Gegenpart zu toJSON() ?
Beitrag von: betateilchen am 16 August 2018, 13:43:16
Zitat von: Tobias am 16 August 2018, 12:48:36
mal vorsichtig nachfragen: steht das in irgendeiner Doku? Commandref, Development-wiki,...?

es steht zumindest in der commandref zu MQTT2_DEVICE als Anwendungsbeispiel.