在Lua变量中保存解码后的JSON值



下面的脚本描述了通过MQTT接收的JSON对象的解码。在这种情况下,我们将以以下JSON对象为例:

{"00-06-77-2f-37-94":{"publish_topic":"/stations/test","sample_rate":5000}} 

在handleOnReceive函数中接收并解码后,使用解码对象调用本地函数saveTable,如下所示:

["00-06-77-2f-37-94"] = {
publish_topic = "/stations/test",
sample_rate = 5000
}

saveTable函数的目标是遍历上面的表并分配值"/stations/test"和5000分别对应变量pubtop和rate。然而,当我打印这两个变量时,两种情况下都返回nil。我如何提取该表的值并将其保存在上述变量中?

如果我只能保存"publish_topic = "/stations/test";和sample_rate = 5000"首先,我需要解析这些以获取上面的值并保存它们,还是有其他方法?

local pubtop
local rate
local function saveTable(t)
local conversionTable = {}

for k,v in pairs(t) do
if type(v) == "table" then
conversionTable [k] = string.format("%q: {", k)
printTable(v)
print("}")
else
print(string.format("%q:", k) .. v .. ",")
end
end
pubtop = conversionTable[0]
rate = conversionTable[1]  
end
local lua_value
local function handleOnReceive(topic, data, _, _)
print("handleOnReceive: topic '" .. topic .. "' message '" .. data .. "'")
print(data)
lua_value = JSON:decode(data)
saveTable(lua_value)
print(pubtop)
print(rate)
end
client:register('OnReceive', handleOnReceive)

上一个问题:解码和解析JSON到Lua

我给您的函数是递归打印表内容。不允许修改它来获得一些特定的值。你的修改没有任何意义。为什么要把这个字符串存储在conversionTable[k]中?你显然不知道自己在做什么。无意冒犯,但你应该在继续之前学习一些基础知识。

我给了你这个函数,所以你可以打印任何你的json解码的结果。

如果你知道你得到了你想要的,那么递归迭代该表是没有意义的。

就这样做吧

for k,v in pairs(lua_value) do
print(k)
print(v.publish_topic)
print(v.sample_rate)
end

现在请阅读Lua参考手册并做一些初学者教程。如果你不知道如何访问表中的元素,你就会浪费大量的时间和资源。这是Lua中最基本、最重要的操作。

最新更新