2

我想将一个多层 json 对象解码成一个表并打印“temp”的值。

p=666
d=23.42
payload='{"d":
             {"pres":'..(p)..',"temp":'..(d)..'}
         }'

t = cjson.decode(payload)

我的第一个想法是这样的:

print(t["d"]["temp"])

但这没有用。如何改进此代码以便使用 Lua-CJson 正确解码?

4

2 回答 2

3

引用的字符串中不能有换行符。

有两种解决方案:

  • 从 中删除换行符'...'

    payload='{"d": {"pres":'..(p)..',"temp":'..(d)..'} }'

  • 使用长字符串形式: [[ ... ],它允许换行。

    payload=[[{"d": {"pres":]]..(p)..',"temp":'..(d)..[[} }]]

您也可以使用模板,这会使事情变得更清晰:

p=666
d=23.42
payload=[[
    { "d":
            {"pres": (p), "temp": (d)}
    }'
]]  
payload=payload:gsub("%((.-)%)",_G)
print(payload)

如果您的字段不是全局变量,请将它们放在一个表中并使用该表而不是_G.

于 2016-02-01T18:28:14.033 回答
0

直接嵌套 Json 似乎不适用于 cJson(至少不适用于带有 NodeMCU 的 ESP8266)我通过在嵌套值周围包装一个数组找到了一个解决方案。

p = 666
d = "23.42"
payload='{"d":[{"pres":'..(p)..',"temp":"'..(d)..'"}]}'
t = cjson.decode(payload)
print(t.d[1].temp) -- prints "23.42"

# 注意 1 - 这意味着您必须在调用变量td[1]之前对数组进行寻址 - Lua 中的数组以数字1开头,并且不像许多其他脚本语言那样从零开始

# 注意 2 - 出于某种原因,浮点值(变量 d)出现“格式错误”错误。作为字符串,该值被解码而没有错误。我必须将变量设为字符串并在值周围加上“双引号”。--> 啊,我发现我正在研究一个整数版本的nodeMCU——它显然不支持浮点数……

于 2017-06-05T15:02:02.803 回答