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
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
geändert von "deine" in "die". Kommt drauf an wer sich angesprochen fühlt oder weiß ob es die Reverse Funktion gibt ;)
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)
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 :)
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.
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.
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
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.
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", ... ]
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?!
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?
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.
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);
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 :)
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.
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.
mal vorsichtig nachfragen: steht das in irgendeiner Doku? Commandref, Development-wiki,...?
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.
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.