因此,我必须使用Lua从Openweathermap API获取天气数据。 我设法发送了一个http请求以返回并存储所有数据,但是现在我陷入了Lua表的束缚,我不知道该如何使用。我对Lua并不陌生,在Lua中如此深的嵌套表方面我找不到任何指南或类似内容。
尤其是我只对main中的temp感兴趣。以下是来自API的示例响应:Sample request response
对Lua表格式化程序的依赖是Lua的socket.http和this json。 这是我的基本代码结构
json = require ("json")
web = require ("socket.http")
local get = json.decode(web.request(<API Link>))
“获取”现在存储了一个我不知道如何使用的表
答案 0 :(得分:1)
在https://www.json2yaml.com/的帮助下,结构为:
cod: '200'
message: 0.0036
cnt: 40
list:
- dt: 1485799200
main:
temp: 261.45
temp_min: 259.086
temp_max: 261.45
pressure: 1023.48
sea_level: 1045.39
grnd_level: 1023.48
humidity: 79
temp_kf: 2.37
weather:
- id: 800
main: Clear
description: clear sky
icon: 02n
clouds:
all: 8
wind:
speed: 4.77
deg: 232.505
snow: {}
sys:
pod: n
dt_txt: '2017-01-30 18:00:00'
…
- dt: 1486220400
…
city:
id: 524901
name: Moscow
coord:
lat: 55.7522
lon: 37.6156
country: none
所以
for index, entry in ipairs(get.list) do
print(index, entry.dt, entry.main.temp)
end
ipairs
遍历表中的正整数键,直到但不包括没有值的第一个整数。看来这就是JSON库表示JSON数组的方式。
答案 1 :(得分:0)
该示例响应似乎包含许多带有false
的子表。试试这个:true
。
答案 2 :(得分:0)
如果您不知道如何使用Lua表,则可能应该学习Lua的基本知识。请参阅https://www.lua.org/start.html
json字符串使用其所有键和值对Lua表进行编码。
您可以阅读编码器如何编码表,也可以只编码自己的表并分析结果json字符串。
main
[1,2,3]
get.list[1].main.temp
{“ 3”:“测试”,“ b”:[1,2],“ a”:1}
以此类推...
总是有表键和值,用冒号分隔。 值可以是数字,字符串,表格... 如果表中只有数字键从一个开始,则该值是括号中这些值的列表。如果表中的键不同,则将其封装在大括号中...
因此,让我们看一下您的结果。我将删除40个条目中的39个以缩短它。我还将缩略以使该结构更具可读性。
print(json.encode({1,2,3}))
答案 3 :(得分:0)
2天后,我终于找到了错误。我当时在一个名为OpenComputers的Minecraft Mod中使用Lua。似乎该mod使用了自己的socket.http版本,每次我想打印响应时,它都会返回两个用于请求的函数。我发现,如果在变量后加上“()”,它将返回的响应作为字符串返回,并且可以使用JSON库将其解码为可用的表。
旁注:我可以这样访问天气:json_table [“ weather”] [“ temp”]
该mod在http请求上的文档很少,因此我不得不通过myslef来解决。谢谢您的回复,最后错误总是出乎意料!