Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [GELÖST] - JSON Parse mit Objekten und Arrays

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [GELÖST] - JSON Parse mit Objekten und Arrays

    This topic has been deleted. Only users with topic management privileges can see it.
    • nukleuz
      nukleuz last edited by nukleuz

      Hallo zusammen,

      ich werde einfach nicht schlau, wie ich mit dem folgenden Skript umgehen soll.
      Der Aufbau bzw. die Reihenfolge/Positionierung der Städte ändert sich aber täglich...

      Ich hole mir ein JSON vom DWD mit den UV-Index Werten - erhalten tue ich das hier:

      {"name":"UV-Gefahrenindex","content":[{"forecast":{"today":3,"dayafter_to":6,"tomorrow":5},"city":"Konstanz"},{"forecast":{"dayafter_to":4,"today":1,"tomorrow":1},"city":"Großer Arber"},{"forecast":{"dayafter_to":4,"today":1,"tomorrow":1},"city":"Waren"},{"forecast":{"tomorrow":3,"dayafter_to":5,"today":2},"city":"Stuttgart"},{"city":"Bremen","forecast":{"tomorrow":5,"dayafter_to":4,"today":3}},{"city":"Kiel","forecast":{"dayafter_to":2,"today":3,"tomorrow":1}},{"city":"Weimar","forecast":{"dayafter_to":6,"today":1,"tomorrow":2}},{"city":"Hahn","forecast":{"today":5,"dayafter_to":5,"tomorrow":3}},{"city":"Marienleuchte","forecast":{"tomorrow":2,"today":3,"dayafter_to":3}},{"forecast":{"dayafter_to":5,"today":2,"tomorrow":2},"city":"Neubrandenburg"},{"city":"Ulm","forecast":{"today":2,"dayafter_to":5,"tomorrow":3}},{"forecast":{"tomorrow":1,"dayafter_to":2,"today":2},"city":"Hamburg"},{"city":"Arkona","forecast":{"today":3,"dayafter_to":3,"tomorrow":3}},{"city":"Kahler Asten","forecast":{"dayafter_to":4,"today":2,"tomorrow":2}},{"forecast":{"dayafter_to":3,"today":4,"tomorrow":4},"city":"Sankt Peter-Ording"},{"city":"Osnabrück","forecast":{"dayafter_to":5,"today":3,"tomorrow":5}},{"forecast":{"today":1,"dayafter_to":3,"tomorrow":1},"city":"Leipzig"},{"city":"Seehausen","forecast":{"tomorrow":1,"dayafter_to":1,"today":2}},{"city":"Norderney","forecast":{"today":4,"dayafter_to":4,"tomorrow":5}},{"forecast":{"tomorrow":1,"dayafter_to":3,"today":1},"city":"Dresden"},{"forecast":{"today":4,"dayafter_to":4,"tomorrow":5},"city":"Düsseldorf"},{"forecast":{"tomorrow":2,"today":3,"dayafter_to":3},"city":"List auf Sylt"},{"city":"Cottbus","forecast":{"today":3,"dayafter_to":2,"tomorrow":1}},{"forecast":{"tomorrow":3,"today":2,"dayafter_to":4},"city":"Zugspitze"},{"city":"Berlin","forecast":{"dayafter_to":1,"today":2,"tomorrow":1}},{"city":"Bonn","forecast":{"tomorrow":4,"today":4,"dayafter_to":4}},{"city":"Wernigerode","forecast":{"today":2,"dayafter_to":3,"tomorrow":2}},{"city":"Würzburg","forecast":{"dayafter_to":5,"today":3,"tomorrow":3}},{"forecast":{"tomorrow":2,"today":1,"dayafter_to":5},"city":"Nürnberg"},{"city":"Freiburg","forecast":{"tomorrow":5,"today":4,"dayafter_to":5}},{"city":"Rostock","forecast":{"dayafter_to":3,"today":3,"tomorrow":2}},{"forecast":{"today":1,"dayafter_to":4,"tomorrow":3},"city":"München"},{"forecast":{"tomorrow":4,"dayafter_to":5,"today":3},"city":"Frankfurt/Main"},{"forecast":{"today":1,"dayafter_to":4,"tomorrow":2},"city":"Regensburg"},{"forecast":{"tomorrow":1,"dayafter_to":5,"today":2},"city":"Magdeburg"},{"forecast":{"tomorrow":4,"today":2,"dayafter_to":3},"city":"Hannover"},{"forecast":{"tomorrow":4,"today":3,"dayafter_to":5},"city":"Weinbiet"},{"forecast":{"tomorrow":4,"today":3,"dayafter_to":4},"city":"Kassel"}],"last_update":"2021-05-12T07:00:00","sender":"Deutscher Wetterdienst - Medizin-Meteorologie","next_update":"2021-05-13T07:00:00","forecast_day":"2021-05-12"}
      

      HIer mein Skript:

      schedule('{"time":{"exactTime":true,"start":"13:56"},"period":{"days":1}}', async function () {
        try {
          require("request")('https://opendata.dwd.de/climate_environment/health/alerts/uvi.json', async function (error, response, result) {
            setState("0_userdata.0.DWD.UV-Index.json-string", result, true);
            console.log(result);
          }).on("error", function (e) {console.error(e);});
        } catch (e) { console.error(e); }
      
          getUVIndexData();
      
      });
      
      function getUVIndexData() {
          var resultUVIndex, res;
          var obj, heuteUVI, cityUVI, morgenUVI, uemorgenUVI, lastUpdate;
      
      // Datum formatieren
          var deDate = new Date(Date());
          deDate.toLocaleDateString('de-DE', {
              year: "numeric",
              month: "2-digit",
              day: "2-digit",
              hour: "2-digit",
              minute: "2-digit",
              second: "2-digit",
          });
      
      //Verarbeiten des JSON-Arrays
          setTimeout(function() {
          // Code, der erst nach 2 Sekunden ausgeführt wird
      
          resultUVIndex = getState("0_userdata.0.DWD.UV-Index.json-string").val;
          res = JSON.parse(getState("0_userdata.0.DWD.UV-Index.json-string").val);
      
              try {obj = JSON.parse(resultUVIndex);
              } catch (e) {
                      console.error('Cannot parse:');
                      return;
              }
      
              // TEST -------------------------------
              for (const key in res) {
                  if(obj.hasOwnProperty(key)){
                  console.log(`${key} : ${res[key]}`)
                  }
              }   
              // TEST --------------------------------   
      
              // Objektvariablen
              heuteUVI        = obj.content[9].forecast.today;  
              morgenUVI       = obj.content[9].forecast.tomorrow;
              uemorgenUVI     = obj.content[9].forecast.dayafter_to;        
              cityUVI         = obj.content[9].city;     
              lastUpdate      = obj.last_update;
              console.log(cityUVI);
      
              // Datenpunkte werden mit Inhalt gefüllt
              setState('0_userdata.0.DWD.UV-Index.uvindex-heute', (heuteUVI)); 
              setState('0_userdata.0.DWD.UV-Index.uvindex-morgen', (morgenUVI)); 
              setState('0_userdata.0.DWD.UV-Index.uvindex-uebermorgen', (uemorgenUVI));                
              setState('0_userdata.0.DWD.UV-Index.region', (cityUVI));
              setState('0_userdata.0.DWD.UV-Index.timestamp', (deDate));
              setState('0_userdata.0.DWD.UV-Index.lastupdated', (lastUpdate));
      
          }, 2000);
      };
      

      Ziel ist es die Werte der Stadt "Hannover" zu erhalten egal wo diese im JSON positioniert sind.

      Vielleicht kann das jemand von euch - ich wäre dankbar 🙂

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

        @nukleuz sagte: Ziel ist es die Werte der Stadt "Hannover" zu erhalten egal wo diese im JSON positioniert sind.

        Ansatz:

        let content = obj.content; // Array
        for(let i = 0; i < content.length; i++) {
            if(content[i].city == 'Hannover') {
                let heuteUVI = content[i].forecast.today; 
                // usw.
            }
        }
        

        Ohne den "Umweg" über den JSON-Datenpunkt kann auf die Verzögerung verzichtet werden. Zeile 9:

            getUVIndexData(result);
        

        Zeile 13:

        function getUVIndexData(res) {
        

        Zeile 35:

                try {obj = JSON.parse(res);
        
        nukleuz 1 Reply Last reply Reply Quote 0
        • nukleuz
          nukleuz @paul53 last edited by

          @paul53

          Super - der Ansatz funktioniert perfekt 👌

          Für den direkten Weg muss ich mal heute Abend schauen. Eben auf die Schnelle hab ich einen Parse error erhalten.

          Melde mich nochmal - die Kinder rufen 🤷‍♂️😂

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

            @nukleuz sagte: Für den direkten Weg

            Versuche es mal so:

            const url  = 'https://opendata.dwd.de/climate_environment/health/alerts/uvi.json';
            const path = '0_userdata.0.DWD.UV-Index.';
             
            function getUVIndexData(json) {
                let obj = JSON.parse(json);
                let content = obj.content; // Array
                for(let i = 0; i < content.length; i++) {
                    if(content[i].city == 'Hannover') {
                        setState(path + 'uvindex-heute', content[i].forecast.today, true); 
                        setState(path + 'uvindex-morgen', content[i].forecast.tomorrow, true); 
                        setState(path + 'uvindex-uebermorgen', content[i].forecast.dayafter_to, true);                
                        setState(path + 'lastupdated', obj.last_update, true);
                        break;
                    }
                }
            }
            
            schedule('3 9 * * *', function () {
                request(url, function(error, response, result) {
                    if(error) log(error, 'error');
                    else getUVIndexData(result);
                });
            });
            
            F nukleuz 2 Replies Last reply Reply Quote 0
            • F
              fastfoot @paul53 last edited by

              @paul53 sagte in JSON Parse mit Objekten und Arrays // DWD UV-Index:

              Versuche es mal so:

              Wie immer perfekt. Hier noch eine Alternative mit Jsonata

               
              function getUVIndexData(json) {
                  let obj = JSON.parse(json);
                  let fltr = `$.content[city.$match(/Hannover./)].{
                      "city":city,
                      "today":forecast.today,
                      "tomorrow":forecast.tomorrow,
                      "dayafter_to":forecast.dayafter_to,
                      "last_update":$$.last_update,
                      "now":$now()
                  }`;
                  obj = jsonataExpression(obj, fltr);
                  setState(path + 'uvindex-heute', obj.today, true); 
                  setState(path + 'uvindex-morgen', obj.tomorrow, true); 
                  setState(path + 'uvindex-uebermorgen', obj.dayafter_to, true);                
                  setState(path + 'lastupdated', obj.last_update, true);
                  setState(path + 'now', obj.now, true);
              }
              
              
              nukleuz 1 Reply Last reply Reply Quote 0
              • nukleuz
                nukleuz @paul53 last edited by

                @paul53

                Danke - großes Kino - das funzt!
                Das ist für mich sogar verständlich und gut nachvollziehbar.

                1 Reply Last reply Reply Quote 0
                • nukleuz
                  nukleuz @fastfoot last edited by

                  @fastfoot

                  Auch das läuft ✊

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  840
                  Online

                  31.8k
                  Users

                  80.0k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  415
                  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