NEWS
[gelöst] JSON - prüfen ob Wert vorhanden ist
-
Hallo,
ich habe einen Mähroboter bei dem ich regelmäßig Daten per json abfrage und diese Werte dann in Variablen schreibe.
Hierbei werden Timer-variablen (je nach Verfügbarkeit) übertragen oder eben nicht.
Wenn die Daten nicht vorhanden sind bekomme ich eine Fehlermeldung (weil ja Wert nicht verfügbar).
Diesen Fehler möchte ich abgreifen.
Folgendes kleines Test-Script:
//obj = {"successful": true, "name": "Robo-Maeh", "status": {"status": 17, "stopped": false, "duration": 53363, "mode": 0, "battery": 100, "hours": 85}, "timer": {"status": 2, "next": {"date": "12.07.2017", "time": "12:00:00", "unix": 1499860800}}, "wlan": {"signal": -61}, "health": {"temperature": 28, "humidity": 28}}; obj = {"successful": true, "name": "Robo-Maeh", "status": {"status": 17, "stopped": false, "duration": 53363, "mode": 0, "battery": 100, "hours": 85}, "timer": {"status": 2}, "wlan": {"signal": -61}, "health": {"temperature": 28, "humidity": 28}}; var test =""; if (typeof(obj.timer.next.date) == "undefined") { log ('undefined = ja'); } else { var test = obj.timer.next.date; log (test); }
Lt. Internet müsste doch die if-Abfrage (typeof) richtig sein.
Klappt aber nicht.
Kann mir jemand mal helfen, was daran falsch ist ?
mfg
Dieter
-
Hey,
ne "typeof" ist der Datentyp. "undefined "Ist der Wert.
Aber ein
if (obj.timer.next.date === "undefined") {
sollte tun. Um ganz sicherzu gehen solltest DU ggf ein
if (!obj.timer || !obj.timer.next || obj.timer.next.date === "undefined") {
machen , damit prüfst Du ob de rganze Pfad in der Struktur da ist … falls auch das ggf ein Problem ist
-
Danke für die schnelle Antwort.
Das: if (obj.timer.next.date === "undefined") {
hat nicht geklappt. Es kommt immer noch Fehlermeldung …TypeError: Cannot read property 'date' of undefined at script.js.Scripte.test2:109:19 .....
Wenn: if (!obj.timer || !obj.timer.next || obj.timer.next.date === "undefined") {
funktioniert es.
Danke.
mfg
Dieter
-
if (!obj.timer || !obj.timer.next || obj.timer.next.date === "undefined") ```` `
Dürfte so immer noch nicht stimmen. Ein Datums-Wert sollte niemals gleich dem String "undefined" sein.
if (!obj.timer || !obj.timer.next || typeof obj.timer.next.date === "undefined")
Ist besser. Du mischst hier aber zwei Methoden, auf Vorhandensein des Objekts zu prüfen. Die implizite, etwas unsichere Variante mit ! und die ausführliche mit typeof … === "undefined".
Die Variante mit ! hat unvorhergesehen Konsequenzen wenn einer der Werte irgendwie in einen Wahrheitswert konvertiert werden kann (siehe http://davidbcalhoun.com/2011/checking-for-undefined-null-and-empty-variables-in-javascript/). Wenn du das ausschließen kannst, wäre die kurze Variante:
if (! (obj && obj.timer && obj.timer.next && obj.timer.next.date)) // sprich: wenn NICHT alle Objekte (obj, obj.timer, obj.timer.next, obj.timer.next.date) einen Wert haben, dann...
Ansonsten müsstest du strenggenommen folgendes prüfen:
if (typeof obj === "undefined" || typeof obj.timer === "undefined" || ...)
Oder mit roher Gewalt:
var date; try { date = obj.timer.next.date; } catch (e) { // ein Objekt in der Kette war nicht definiert. }
-
Hallo alcalzone,
so richtig verstanden habe ich das nicht (habs nun schon 5 x gelesen).
Also:
Der json hat manchmal den Abschnitt next; dabei sind dann auch date und time enthalten:
…. "timer": {"status": 2, "next": {"date": "12.07.2017", "time": "12:00:00", "unix": 1499860800}} ....
Diesen bearbeite ich dann weiter, alles gut.
Wenn der json aber nun nicht date und time hat; also so:
.... "timer": {"status": 2} .....
dann bekomme ich die Fehlermeldungen (oder eben mit dem code von appollon nicht mehr).
Was wäre denn die richtige, notwendige Prozedur, damit man dies korrekt abfängt ?
mfg
Dieter
-
Da obj.timer.next.date nur false liefern kann, wenn nicht vorhanden, sollte so eine ausreichende Abfrage aussehen:
if (obj.timer && obj.timer.next && obj.timer.next.date) { var test = obj.timer.next.date; log (test); } else { log ('undefined = ja'); }
Der json hat manchmal den Abschnitt next; dabei sind dann auch date und time enthalten:
…. "timer": {"status": 2, "next": {"date": "12.07.2017", "time": "12:00:00", "unix": 1499860800}} .... `
Wenn das so gewährleistet ist, genügt auch ein Minimaltestif (obj.timer.next) { var test = obj.timer.next.date; log (test); } else { log ('undefined = ja'); }
-
Hallo,
danke für eure Hinweise.
Habe es jetzt so gelöst:
if (obj.timer.next) { setState('javascript.0.Status.Mähroboter.Timer.next_date', obj.timer.next.date.substr(0,obj.timer.next.date.length-4)); setState('javascript.0.Status.Mähroboter.Timer.next_time', obj.timer.next.time.substr(0,obj.timer.next.time.length-3)); } else { log ('Mähroboter: - next: date und time - kann nicht gelesen werden.'); }
Klappt wunderbar.
mfg
Dieter