NEWS
JSON parsing (verschachtelt)
-
Nabend,
ich konnt mein Problem zwar inzwischen über NodeRed lösen, aber irgendwie lässt es mir doch keine Ruhe dass ich es nicht über JavaScript hinbekam. Schließlich möchte man ja auch etwas lernenIch habe einen MHZ19B Co2 Sensor, welcher seine Daten zum MQTT Broker liefert (Sonoff Adapter nutze ich in diesem Fall bewusst nicht).
Id:
mqtt.0.SmartHome.Wohnzimmer.Co2.SENSOR
Wert:
{"Time":"2019-11-28T16:45:07","MHZ19B":{"Model":"B","CarbonDioxide":786,"Temperature":23.0},"TempUnit":"C"}
Ich möchte nun lediglich den Wert von CarbonDioxide in eine neue Variable schreiben. Mein Problem ist dass ich nicht verstanden habe wie ich quasi auf die Unterebene "MHZ19B" gelange.
Auf Grund der anderen Beiträge hatte ich es mit
var pfad = "javascript.0.jsonconverter."; var channel = "wohnzimmer."; var sname = "co2."; var idco2 = pfad + channel + sname + 'co2'; // Create States createState(idco2, 0,{type: 'number',name: 'CarbonDioxid', read: true,write: true,role: 'value'}); // script beginning on({id: 'mqtt.0.SmartHome.Wohnzimmer.Co2.SENSOR', change: "any"}, function (obj) { //variabele erstellen fuer meine 3 beispiel objecte var co2; try {obj = JSON.parse(getState('mqtt.0.SmartHome.Wohnzimmer.Co2.SENSOR').val); } catch (e) { console.error('Cannot parse: ' + getState('mqtt.0.SmartHome.Wohnzimmer.Co2.SENSOR').val); return; } co2 = obj.CarbonDioxide; setState(idco2, co2); log(co2); });
probiert, aber das schlug fehl. And Dinge wie TempUnit kam ich zwar beim Testen heran, aber nicht an die innerhalb von "MHZ19B": {}
was ja ein Array zu sein scheint?Ich habe dann eher im Nebel gestochert und Dinge wie
co2 = obj.MHZ19B.CarbonDioxide;
ausprobiert, aber das war wohl der falsche Ansatz.
-
@leif1 dein letztes Beispiel ist richtig. Probier mal nachstehendes.
let values; try { values = JSON.parse(getState('mqtt.0.SmartHome.Wohnzimmer.Co2.SENSOR').val); } catch (e) { console.error('Cannot parse: ' + getState('mqtt.0.SmartHome.Wohnzimmer.Co2.SENSOR').val); return; } let co2 = values.MHZ19B.CarbonDioxide;
J.A.R.V.I.S.
-
Danke @J-A-R-V-I-S
Nun bekomme ich im log immer
(856) Error in callback: SyntaxError: Identifier 'co2' has already been declared
-
@leif1 sagte:
Identifier 'co2' has already been declared
Dann lösche die Deklaration in Zeile 17
//variabele erstellen fuer meine 3 beispiel objecte var co2;
-
Danke vielmals euch beiden, nun läuft es. Mir war nicht so ganz bewusst das "let" ebenfalls eine Variable deklariert. Man lernt nie aus
-
@leif1 das freut mich zu hören. Es gibt auch einige Unterschiede zwischen den beiden Möglichkeiten. Falls dich das näher interessiert, kannst du dir mal folgenden Artikel durchlesen (Unterschiede var und let). Ich würde sagen, dass let die schönere Variante ist.
J.A.R.V.I.S.
-
@J-A-R-V-I-S
um die Verwirrung komplett zu machen ,
dass würde auch gehen:const tVal = {"Time":"2019-11-28T16:45:07","MHZ19B":{"Model":"B","CarbonDioxide":786,"Temperature":23.0},"TempUnit":"C"} const { MHZ19B: { CarbonDioxide: co2 } } = tVal; if(co2) log(co2);
guten nacht
-
@Nahasapee Ist allerdings für eine einzelne Variable nicht unbedingt leserlicher
-
@AlCalzone In der Kürze liegt die Würze.
-
@Nahasapee kürzer ist es auch nicht
const co2 = values.MHZ19B.CarbonDioxide; const { MHZ19B: { CarbonDioxide: co2 } } = values;
Imo macht diese Form der Destrukturierung nur bei mehreren Variablen Sinn.
-
@AlCalzone sagte in JSON parsing (verschachtelt):
@Nahasapee kürzer ist es auch nicht
Mein Frau sagt immer auf die Länge kommt es nicht an!