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 :)
-
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); -
@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); }); }); -
@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); } -
@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); }
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden