Autor Thema: Gegenpart zu toJSON() ?  (Gelesen 575 mal)

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3545
Gegenpart zu toJSON() ?
« 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
« Letzte Änderung: 13 August 2018, 12:23:14 von Tobias »
FHEM auf Cubitruck mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, SprinkleControl, Sprinkle, TrashCal, MediaList

Offline Thorsten Pferdekaemper

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4685
  • Finger weg von der fhem.cfg
Antw:Gegenpart zu toJSON() ?
« Antwort #1 am: 13 August 2018, 10:34:08 »
deine neue Funktion toJSON()
Hi,
wen meinst Du denn? Ich glaube, hier lesen so einige mit...
Gruß,
   Thorsten
RasPi
Heizkessel-Steuerung per Arduino und HTTPMOD
und einen Haufen Homematic (Wired)

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3545
Antw:Gegenpart zu toJSON() ?
« Antwort #2 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 ;)
FHEM auf Cubitruck mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, SprinkleControl, Sprinkle, TrashCal, MediaList

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14987
  • s/fhem\.cfg/configDB/g
Antw:Gegenpart zu toJSON() ?
« Antwort #3 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 in fhem.pl vorhanden. Und ich bin schuld daran  8)

« Letzte Änderung: 13 August 2018, 14:30:26 von betateilchen »
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 07.09.2018 - 18:30 Uhr

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14987
  • s/fhem\.cfg/configDB/g
Antw:Gegenpart zu toJSON() ?
« Antwort #4 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 :)
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 07.09.2018 - 18:30 Uhr

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 18827
Antw:Gegenpart zu toJSON() ?
« Antwort #5 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.

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14987
  • s/fhem\.cfg/configDB/g
Antw:Gegenpart zu toJSON() ?
« Antwort #6 am: 13 August 2018, 14:46:46 »
Es ist nicht eilig.

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.
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 07.09.2018 - 18:30 Uhr

Offline Dr. Boris Neubert

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 4190
Antw:Gegenpart zu toJSON() ?
« Antwort #7 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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14987
  • s/fhem\.cfg/configDB/g
Antw:Gegenpart zu toJSON() ?
« Antwort #8 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.
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 07.09.2018 - 18:30 Uhr

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3545
Antw:Gegenpart zu toJSON() ?
« Antwort #9 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:
Zitat
Man ü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", ... ]
FHEM auf Cubitruck mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, SprinkleControl, Sprinkle, TrashCal, MediaList

Offline Christoph Morrison

  • Developer
  • Full Member
  • ****
  • Beiträge: 323
    • Private Website
Antw:Gegenpart zu toJSON() ?
« Antwort #10 am: 14 August 2018, 08:51:20 »
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?!

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14987
  • s/fhem\.cfg/configDB/g
Antw:Gegenpart zu toJSON() ?
« Antwort #11 am: 14 August 2018, 08:58:10 »
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?
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 07.09.2018 - 18:30 Uhr

Offline Dr. Boris Neubert

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 4190
Antw:Gegenpart zu toJSON() ?
« Antwort #12 am: 14 August 2018, 10:53:33 »
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!

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3545
Antw:Gegenpart zu toJSON() ?
« Antwort #13 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);
FHEM auf Cubitruck mit Homematic, MAX, PCA301, Panstamp-Sensoren, RPi mit 2x 1wire, RPi mit Text2Speech.
Maintainer der Module: DbLog, Text2Speech, SprinkleControl, Sprinkle, TrashCal, MediaList

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14987
  • s/fhem\.cfg/configDB/g
Antw:Gegenpart zu toJSON() ?
« Antwort #14 am: 14 August 2018, 13:43:50 »
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 :)
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 07.09.2018 - 18:30 Uhr

 

decade-submarginal