Lua — извлечение специфики из JSON

#json #lua

#json #lua

Вопрос:

Я пытаюсь извлечь значения из JSON, но, похоже, я могу получить только первое, как мне получить (а) все три вместе, (б) только одно из них и (в) настроить цикл, чтобы что-то делать с каждым.

К вашему сведению — я использую модуль ‘dkjson

Вот код.

 
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
  

И у меня есть еще один JSON, где я не могу извлечь специфику —

 
local json = require "dkjson"
local j = [[
{"501":"34.1 amp;deg;C flow","502":"0 % Power","503":"24 amp;deg;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 amp;deg;C Return","522":"0 liter/hour Flow","524":"0 amp;deg;C External temperature",
"525":"54 amp;deg;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 amp;deg;C Smoke temp.","533":"65 amp;deg;C Target boiler temp.","534":"56 amp;deg;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 amp;deg;C air temperature","591":"130 null","592":"0.0 amp;deg;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''
  

Комментарии:

1. Ваш второй бит должен быть print(data["531"])

Ответ №1:

Ваш JSON — это, по сути, три JSON, разделенных запятой. Вам нужно заключить его в другую пару скобок, чтобы сделать его допустимым 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
  

Ваша data таблица, индексируемая строковыми представлениями чисел: print (data['531']) будет печатать то, что вы хотите.