Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] JSON - prüfen ob Wert vorhanden ist

    NEWS

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    [gelöst] JSON - prüfen ob Wert vorhanden ist

    This topic has been deleted. Only users with topic management privileges can see it.
    • bahnuhr
      bahnuhr Forum Testing Most Active last edited by

      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

      1 Reply Last reply Reply Quote 0
      • apollon77
        apollon77 last edited by

        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

        1 Reply Last reply Reply Quote 0
        • bahnuhr
          bahnuhr Forum Testing Most Active last edited by

          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

          1 Reply Last reply Reply Quote 0
          • AlCalzone
            AlCalzone Developer last edited by

            @bahnuhr:

            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.
            }
            
            
            1 Reply Last reply Reply Quote 0
            • bahnuhr
              bahnuhr Forum Testing Most Active last edited by

              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

              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by

                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');
                }
                
                

                @bahnuhr:

                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 Minimaltest

                if (obj.timer.next) {
                    var test = obj.timer.next.date;
                    log (test);
                } else {
                    log ('undefined = ja');
                }
                
                1 Reply Last reply Reply Quote 0
                • bahnuhr
                  bahnuhr Forum Testing Most Active last edited by

                  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

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  837
                  Online

                  32.0k
                  Users

                  80.5k
                  Topics

                  1.3m
                  Posts

                  4
                  7
                  2523
                  Loading More Posts
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes
                  Reply
                  • Reply as topic
                  Log in to reply
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                  The ioBroker Community 2014-2023
                  logo