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
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.
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.
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.
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
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.
Wie mache ich das genau, kannst du mir mal ein Beispiel geben?
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}) }
Hervorragend, danke schön.
Wieder was gelernt.
Gruß
Carlos