NEWS
[GELÖST] - JSON Parse mit Objekten und Arrays
-
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
-
@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);
-
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
-
@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); }); });
-
@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); }
-
Danke - großes Kino - das funzt!
Das ist für mich sogar verständlich und gut nachvollziehbar. -
Auch das läuft