nodecentral
nodecentral

Reputation: 466

Lua - extracting specifics from a JSON

I’m trying to extract values from a JSON, but I can only seem to retrieve the first one, how do I get (a) all three together, (b) just one of them and (c) set up a loop to do something with each one.

FYI - I’m using the module ‘dkjson

Here is the code.


local json = require "dkjson"
local result = [[{
    "eventEnd":1411581600,
    "eventStart":1411578000,
    "eventParameter":"",
    "eventName":"TEST 1"
    },
    {
    "eventEnd":1411585200,
    "eventStart":1411581600,
    "eventParameter":"",
    "eventName":"TEST 2"
    },
    {
    "eventEnd":1411585299,
    "eventStart":1411581699,
    "eventParameter":"",
    "eventName":"TEST 3"}
]]
    

local LogVariables = json.decode(result)
print(LogVariables.eventEnd) -- prints just the first one 1411581600

And I have another JSON too where I’m unable to extract specifics -


local json = require "dkjson"
local j = [[
{"501":"34.1 °C flow","502":"0 % Power","503":"24 °C Shaft","504":"0 kW Power","505":"18.2 kg Hopper","506":"0 Lx Light",
"507":"Error no pellets ","508":"16/01-2018 12:22:30","521":"0 °C Return","522":"0 liter/hour Flow","524":"0 °C External temperature",
"525":"54 °C Temperature DHW","526":"15.7 % Actual oxygen","527":"0 % Target oxygen","528":"850 Gram auger/6 min","530":"10.115 kg Today",
"531":"0 kg/m2 Today","532":"0 °C Smoke temp.","533":"65 °C Target boiler temp.","534":"56 °C Target DHW temp.","542":" ","584":"Nitra ",
"585":"86 % humidity","586":"1005 hPa pressure","587":"6.2 m/s wind speed","588":"http://openweathermap.org/img/w/13d.png ",
"589":"-2 °C air temperature","591":"130 null","592":"0.0 °C T5","alarm":"1"}
]]

local data = json.decode(j)
print(data) -- returns a table --
-- print(data.531) -- returns error ')' expected near '.531'
-- print(data.[531]) -- returns error '' expected near '['
-- print(data.'531') -- returns error '' expected near ''531''

Upvotes: 0

Views: 455

Answers (1)

Alexander Mashin
Alexander Mashin

Reputation: 4564

Your JSON is, in fact, three JSONs separated by a comma. You need to enclose it in another pair of brackets to make it a valid JSON:

local json = require "dkjson"
local result = [[ [{
    "eventEnd":1411581600,
    "eventStart":1411578000,
    "eventParameter":"",
    "eventName":"TEST 1"
    },
    {
    "eventEnd":1411585200,
    "eventStart":1411581600,
    "eventParameter":"",
    "eventName":"TEST 2"
    },
    {
    "eventEnd":1411585299,
    "eventStart":1411581699,
    "eventParameter":"",
    "eventName":"TEST 3"}
] ]]
    

local LogVariables = json.decode(result)
for _, event in ipairs (LogVariables) do
    print (event.eventEnd)
end

Your data is a table indexed by string representations of numbers: print (data['531']) will print what you want.

Upvotes: 2

Related Questions