[gelöst] - json2nameValue Problem

Begonnen von carlos, 16 November 2018, 12:49:35

Vorheriges Thema - Nächstes Thema

carlos

Hallo,
Ich habe ein json2nameValue Probem:
folgender gültiger JSON string soll umgewandelt werden:

{"position":{"id":53216,"attributes":{"batteryLevel":90,"distance":0.88,"totalDistance":7010214.07,"motion":false},"deviceId":1,"type":null
,"protocol":"osmand","serverTime":"2018-11-16T10:57:08.959+0000","deviceTime":"2018-11-16T10:57:07.000+0000","fixTime":"2018-11-16T10:57:07.000+0000","outdated":false,"val
id":true,"latitude":1.23456,"longitude":1.23456,"altitude":100,"speed":20,"course":0,"address":null,"accuracy":20.23299980163574,"network":null},"device":{"id":1,"attribut
es":{},"groupId":0,"name":"Foo","uniqueId":"Bar","status":"online","lastUpdate":"2018-11-16T10:57:08.960+0000","positionId":53216,"geofenceIds":[3],"phone":"+49 160 123456
","model":"xyz","contact":"Peter Müller","category":"person","disabled":false}}


Ich habe das mal über telnet getestet:


fhem> { my $r = json2nameValue('{"position":{"id":53216,"attributes":{"batteryLevel":90,"distance":0.88,"totalDistance":7010214.07,"motion":false},"deviceId":1,"type":null
,"protocol":"osmand","serverTime":"2018-11-16T10:57:08.959+0000","deviceTime":"2018-11-16T10:57:07.000+0000","fixTime":"2018-11-16T10:57:07.000+0000","outdated":false,"val
id":true,"latitude":1.23456,"longitude":1.23456,"altitude":100,"speed":20,"course":0,"address":null,"accuracy":20.23299980163574,"network":null},"device":{"id":1,"attribut
es":{},"groupId":0,"name":"Foo","uniqueId":"Bar","status":"online","lastUpdate":"2018-11-16T10:57:08.960+0000","positionId":53216,"geofenceIds":[3],"phone":"+49 160 123456
","model":"xyz","contact":"Peter Müller","category":"person","disabled":false}}');; join("\n", map { "$_:$r->{$_}" } keys %{$r}) }                                         


Mit folgendem Ergebnis:

device_model:xyz                                                                                                                                                           
position_deviceId:1                                                                                                                                                       
position_attributes_distance:0.88                                                                                                                                         
position_attributes_totalDistance:7010214.07                                                                                                                               
device_uniqueId:Bar                                                                                                                                                       
position_attributes_batteryLevel:90                                                                                                                                       
device_name:Foo                                                                                                                                                           
device_lastUpdate:2018-11-16T10:57:08.960+0000                                                                                                                             
device_contact:Peter Müller                                                                                                                                               
device_id:1                                                                                                                                                               
device_status:online                                                                                                                                                       
device_phone:+49 160 123456                                                                                                                                               
device_category:person                                                                                                                                                     
position_id:53216                                                                                                                                                         
device_positionId:53216                                                                                                                                                   
device_disabled:false                                                                                                                                                     
position_attributes_motion:false                                                                                                                                           
device_groupId:0                                                                                                                                                           
device_geofenceIds_1:3                                                                                                                                                     
fhem>                                                                                                                                                                     


Da fehlt leider der zu position gehörende Teil:

"deviceId":1,"type":null
,"protocol":"osmand","serverTime":"2018-11-16T10:57:08.959+0000","deviceTime":"2018-11-16T10:57:07.000+0000","fixTime":"2018-11-16T10:57:07.000+0000","outdated":false,"val
id":true,"latitude":1.23456,"longitude":1.23456,"altitude":100,"speed":20,"course":0,"address":null,"accuracy":20.23299980163574,"network":null}


Ist das ein Bug oder gibt es da Einschränkungen?

Gruß
Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

betateilchen

#1
Zitat von: carlos am 16 November 2018, 12:49:35
Da fehlt leider der zu position gehörende Teil:
...
Ist das ein Bug oder gibt es da Einschränkungen?

Die Funktion hat Einschränkungen, sie kann z.B. auch keine arrays innerhalb des JSON verarbeiten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatDie Funktion hat Einschränkungen, sie kann z.B. auch keine arrays innerhalb des JSON verarbeiten.
Sowas habe ich gefuehlt vor 2 Monaten implementiert.

ZitatDa fehlt leider der zu position gehörende Teil:
Die Funktion hat null nicht gekannt, das habe ich ihr jetzt beigebracht.

betateilchen

Zitat von: rudolfkoenig am 16 November 2018, 13:30:47
Sowas habe ich gefuehlt vor 2 Monaten implementiert.

ok, das war mir neu. Danke für die Info, ich kannte nur die ursprüngliche Version, in der explizit auf Einschränkungen hingewiesen wurde.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

carlos

Danke für den fix, das funktioniert jetzt.
Ich habe noch eine andere Frage.
Kann ich mir mit json2nameValue auch aus dem ganzen JSON string nur einen Teil umwandeln lassen, also nur den Device Teil?
"device":{"id":1,"attribut
es":{},"groupId":0,"name":"Foo","uniqueId":"Bar","status":"online","lastUpdate":"2018-11-16T10:57:08.960+0000","positionId":53216,"geofenceIds":[3],"phone":"+49 160 123456
","model":"xyz","contact":"Peter Müller","category":"person","disabled":false}


Ich möchte erreichen, dass ich die Readings quasi einzeln bekomme nicht z.b.: device_id sondern nur id.
Falls nicht, evtl. ein Tip wie ich das hinkriegen könnte.
Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

rudolfkoenig

ZitatKann ich mir mit json2nameValue auch aus dem ganzen JSON string nur einen Teil umwandeln lassen, also nur den Device Teil?
Ja, z.Bsp. wenn du das Ergebnis filterst, d.h. einmal umkopierst, und dabei nur "passende" Schluessel uebernimmst.

carlos

Wie mache ich das genau, kannst du mir mal ein Beispiel geben?
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

rudolfkoenig

Habe dein Beispiel von oben erweitert:fhem> { my $r = json2nameValue('{"position":{"id":53216,"attributes":{"batteryLevel":90,"distance":0.88,"totalDistance":7010214.07,"motion":false},"deviceId":1,"type":null,"protocol":"osmand","serverTime":"2018-11-16T10:57:08.959+0000","deviceTime":"2018-11-16T10:57:07.000+0000","fixTime":"2018-11-16T10:57:07.000+0000","outdated":false,"valid":true,"latitude":1.23456,"longitude":1.23456,"altitude":100,"speed":20,"course":0,"address":null,"accuracy":20.23299980163574,"network":null},"device":{"id":1,"attributes":{},"groupId":0,"name":"Foo","uniqueId":"Bar","status":"online","lastUpdate":"2018-11-16T10:57:08.960+0000","positionId":53216,"geofenceIds":[3],"phone":"+49 160 123456","model":"xyz","contact":"Peter Müller","category":"person","disabled":false}}');; join("\n", map { "$_:$r->{$_}" } grep /^device/,keys %{$r}) }

carlos

Hervorragend, danke schön.
Wieder was gelernt.
Gruß
Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly