cjson.decode() 解析多层次 JSON。

我想将一个多层级的 JSON 对象解码成一个表格,并打印出 "temp" 的值。

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

t = cjson.decode(payload)

我的第一思路是这样的:

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

但是这样不起作用。我该如何改进这段代码,以便它正确地使用 Lua-CJson 进行解码呢?

点赞
用户107090
用户107090

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

有两种解决方法:

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

    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-01 18:28:14
用户4150069
用户4150069

使用 cJson 直接嵌套 Json 在 ESP8266 上似乎无法工作(至少在 NodeMCU 上不行),我通过在嵌套的值周围包装一个数组来找到了一个解决方案。

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

# 注意1 - 这意味着在调用变量 t.d[1] 之前必须先处理数组。Lua 中的数组以数字 1 开始,而不是像许多其他脚本语言一样基于零。

# 注意2 - 由于某种原因,浮点值(变量 d)会出现“格式错误”的错误。作为字符串,该值可以被正确解码。我必须将变量转换为字符串并在值周围加上“双引号”。 --> 啊,我发现我正在使用一个整数版本的 NodeMCU,它显然不支持浮点数...

2017-06-05 15:02:02