Lua 通过 JSON 生成的表格中获取值
所以,我必须使用 Lua 获取 Openweathermap API 的天气数据。 我设法发送 HTTP 请求以返回和存储所有数据,但现在我卡在了一个我不知道如何处理的 Lua 表格上。我非常不了解 Lua,并且我没有找到任何关于 Lua 中嵌套表格的指南或类似的东西。
特别地,我只对主要的 temp 字段感兴趣。以下是 API 的示例响应: 示例请求响应
Lua 的 socket.http 和 这个 json 转 Lua 表格格式化器是依赖项。 这是我的基本代码结构
json = require ("json")
web = require ("socket.http")
local get = json.decode(web.request(<API Link>))
现在,“get”储存了一个我不知道如何处理的表格
如果你不知道如何使用 Lua 表格,那么可能需要先学习 Lua 的基础知识。可以参考 https://www.lua.org/start.html
JSON 字符串编码了一个包含所有键和值的 Lua 表。
你可以阅读编码器是如何对表格进行编码,或者你可以自己编码一个表格并分析生成的 JSON 字符串。
print(json.encode({1,2,3}))
[1,2,3]
print(json.encode({a=1, b={1,2}, [3]="test"}))
{"3":"test","b":[1,2],"a":1}
以此类推...
表格总是有键和值,用冒号分隔。值可以是数字、字符串、表格... 如果表格只有从 1 开始的数字键,则该值被括在括号中形成值列表。如果表格中有不同的键,则被封装在花括号中...
现在让我们来看看你的结果。我将删除 40 个条目中的 39 个以缩短其长度。我还会进行缩进,以使结构更易读。
{
"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"}
],
"city":{
"id":524901,
"name":"Moscow",
"coord":{
"lat":55.7522,
"lon":37.6156
},
"country":"none"
}
}
使用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数组。
经过两天的努力,我终于找到了错误。我在一个名叫 OpenComputers 的 Minecraft 模组中工作,它使用了 Lua。似乎这个模组使用了自己的 socket.http 版本,每次当我想要打印响应时,它返回了两个request使用的函数。我发现,如果我在变量后面加上“()”,它就会返回响应作为字符串,并且使用 JSON 库我可以将其解码为可工作的表格。
另外说明:我可以这样访问天气: json_table["weather"]["temp"]。
这个模组的 http 请求文档十分不好理解,所以我只能自己试图解决这个问题。感谢你们的回复,在最终错误解决的过程中,这个错误发生得十分出乎意料!
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

那个示例响应似乎有许多包含
main的子表格。尝试这个:get.list[1].main.temp。