Hur läser man ut JSON-data?

Post Reply
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Jag undrar om någon JSON-guru kan hjälpa mig på traven om hur jag skall läsa ut data från en JSON-fil.
Till en QA vill jag hämta datat "cloud_area_fraction" (från "API.met.no"). Jag kan hämta och läsa väderdata från tex. "OpenWeather", men från API.met.no där ligger datan mer "nedbäddad", och det är det jag inte får kläm på hur man läser ut denna.

Raderna i koden nedan ser ut så här, men det funkar inte, men hur skall jag skriva?

if data.properties.timeseries.data.instant.details and properties.timeseries.data.instant.details.cloud_area_fraction then
self:updateProperty("Temperature", data.properties.timeseries.data.instant.details.cloud_area_fraction)
self:updateView("labelTemperature", "text", tostring(data.properties.timeseries.data.instant.details.cloud_area_fraction) .. " %")


Här är sökvägen i JSON-filen

cloud_area_fraction.png

Code: Select all

-- Sample plugin for handling data from https://met.no/
-- To setup this plugin fill proper Latitude, Longitude and Altitude

function QuickApp:fetchWeatherData()
    local address = string.format("https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=%s&lon=%s&altitude=%s", self.lat, self.long, self.alt)
    self:debug("connecting:", address)

    self.http:request(address, {
        options={
            method = 'GET'
        },
        success = function(response)
-----            print(response.data)
            local data = json.decode(response.data)
            if data then
                self:onWatherDataReceived(data)
            end
        end,
        error = function(error)
            self:debug('error: ' .. json.encode(error))
        end
    })   

    fibaro.setTimeout(60 * 60 * 1000, function() 
        self:fetchWeatherData()
    end)
end

-- parse response
function QuickApp:onWatherDataReceived(data)
self:debug("Start update data")

    if  data.properties.timeseries.data.instant.details and properties.timeseries.data.instant.details.cloud_area_fraction then
        self:updateProperty("Temperature", data.properties.timeseries.data.instant.details.cloud_area_fraction)
        self:updateView("labelTemperature", "text", tostring(data.properties.timeseries.data.instant.details.cloud_area_fraction) .. " %")
    end
        self:debug("End update data")
end

function QuickApp:onInit()
    self:debug("onInit")
    self.lat = self:getVariable("Latitude")
    self.long = self:getVariable("Longitude")
    self.alt = self:getVariable("Altitude")
    self.http = net.HTTPClient({timeout=3000})
    self:fetchWeatherData()
end
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Fick du hjälp?
annars så är timeseries en json array

Code: Select all

    if  data.properties.timeseries[1].data.instant.details and data.properties.timeseries[1].data.instant.details.cloud_area_fraction then
        self:updateProperty("Temperature", data.properties.timeseries[1].data.instant.details.cloud_area_fraction)
        self:updateView("labelTemperature", "text", tostring(data.properties.timeseries[1].data.instant.details.cloud_area_fraction) .. " %")
    end
Varje timeseries värde har en tid. timeseries[1] ger den första, vet inte vilken du vill ha,
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Jo, jag kom på det till slut att jag hade missat det. Jag skulle naturligtvis meddelat det i mitt inlägg.
Men tack ändå för hjälpen.
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
Post Reply