Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [gelöst] JSON - prüfen ob Wert vorhanden ist

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    978

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

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

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
7 Beiträge 4 Kommentatoren 2.6k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • bahnuhrB Online
    bahnuhrB Online
    bahnuhr
    Forum Testing Most Active
    schrieb am zuletzt editiert von
    #1

    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


    Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
    Danke.
    gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
    ScreenToGif :https://www.screentogif.com/downloads.html

    1 Antwort Letzte Antwort
    0
    • apollon77A Online
      apollon77A Online
      apollon77
      schrieb am zuletzt editiert von
      #2

      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

      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
      1 Antwort Letzte Antwort
      0
      • bahnuhrB Online
        bahnuhrB Online
        bahnuhr
        Forum Testing Most Active
        schrieb am zuletzt editiert von
        #3

        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


        Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
        Danke.
        gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
        ScreenToGif :https://www.screentogif.com/downloads.html

        1 Antwort Letzte Antwort
        0
        • AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          schrieb am zuletzt editiert von
          #4

          @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.
          }
          
          

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          1 Antwort Letzte Antwort
          0
          • bahnuhrB Online
            bahnuhrB Online
            bahnuhr
            Forum Testing Most Active
            schrieb am zuletzt editiert von
            #5

            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


            Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
            Danke.
            gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
            ScreenToGif :https://www.screentogif.com/downloads.html

            1 Antwort Letzte Antwort
            0
            • paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von
              #6

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

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              1 Antwort Letzte Antwort
              0
              • bahnuhrB Online
                bahnuhrB Online
                bahnuhr
                Forum Testing Most Active
                schrieb am zuletzt editiert von
                #7

                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


                Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                Danke.
                gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                ScreenToGif :https://www.screentogif.com/downloads.html

                1 Antwort Letzte Antwort
                0
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                793

                Online

                32.5k

                Benutzer

                81.6k

                Themen

                1.3m

                Beiträge
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                ioBroker Community 2014-2025
                logo
                • Anmelden

                • Du hast noch kein Konto? Registrieren

                • Anmelden oder registrieren, um zu suchen
                • Erster Beitrag
                  Letzter Beitrag
                0
                • Home
                • Aktuell
                • Tags
                • Ungelesen 0
                • Kategorien
                • Unreplied
                • Beliebt
                • GitHub
                • Docu
                • Hilfe