Lua 访问来自 table 的索引,生成自 JSON
Lua access indeces from table generated from JSON
因此,我必须使用 Lua 从 Openweathermap API 获取天气数据。
我设法向 return 发送了一个 http 请求并存储了所有数据,但现在我被 Lua table 困住了,我不知道如何使用。我是 Lua 的新手,我没有在 Lua.
中找到任何关于如此深嵌套 table 的指南或类似内容
特别是我只对 main 中名为 temp 的字段感兴趣。这是来自 API 的示例响应:Sample request response
依赖项是 Lua 的 socket.http 和 this json 到 Lua table 格式化程序。
这是我的基本代码结构
json = require ("json")
web = require ("socket.http")
local get = json.decode(web.request(<API Link>))
"get" 现在存储 table 我不知道如何使用
该示例响应似乎有许多子表,其中包含 main
。试试这个:get.list[1].main.temp
.
如果您不知道如何使用 Lua table,您可能应该学习 Lua 的基础知识。参考https://www.lua.org/start.html
json 字符串对 Lua table 及其所有键和值进行编码。
您可以阅读编码器如何编码 table 或简单地编码您自己的 table 并分析生成的 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}
等等...
总是有 table 个键和值,用冒号分隔。
值可以是数字、字符串、tables...
如果 table 只有从 1 开始的数字键,则值是括号中这些值的列表。如果你在 table 中有不同的键,它被封装在大括号中...
让我们看看您的结果。我将删除 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
迭代 table 中的正整数键,直到但不包括没有值的第一个整数。这似乎是 JSON 库表示 JSON 数组的方式。
2天后我终于找到了错误。我在名为 OpenComputers 的 Minecraft Mod 工作,它使用 Lua。似乎 mod 使用自己的 socket.http 版本,每次我想打印响应时,它都会返回两个函数以用于请求。我发现,如果我在变量后面放一个“()”,它会以字符串形式返回响应,并且使用 JSON 库,我可以将它解码为可用的 table.
旁注:我可以这样访问天气:json_table["weather"]["temp"]
mod 在 http 请求上的记录非常少,所以我不得不通过 myslef 解决这个问题。感谢您的回复,最后的错误一如既往的出乎意料!
因此,我必须使用 Lua 从 Openweathermap API 获取天气数据。 我设法向 return 发送了一个 http 请求并存储了所有数据,但现在我被 Lua table 困住了,我不知道如何使用。我是 Lua 的新手,我没有在 Lua.
中找到任何关于如此深嵌套 table 的指南或类似内容特别是我只对 main 中名为 temp 的字段感兴趣。这是来自 API 的示例响应:Sample request response
依赖项是 Lua 的 socket.http 和 this json 到 Lua table 格式化程序。 这是我的基本代码结构
json = require ("json")
web = require ("socket.http")
local get = json.decode(web.request(<API Link>))
"get" 现在存储 table 我不知道如何使用
该示例响应似乎有许多子表,其中包含 main
。试试这个:get.list[1].main.temp
.
如果您不知道如何使用 Lua table,您可能应该学习 Lua 的基础知识。参考https://www.lua.org/start.html
json 字符串对 Lua table 及其所有键和值进行编码。
您可以阅读编码器如何编码 table 或简单地编码您自己的 table 并分析生成的 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}
等等...
总是有 table 个键和值,用冒号分隔。 值可以是数字、字符串、tables... 如果 table 只有从 1 开始的数字键,则值是括号中这些值的列表。如果你在 table 中有不同的键,它被封装在大括号中...
让我们看看您的结果。我将删除 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
迭代 table 中的正整数键,直到但不包括没有值的第一个整数。这似乎是 JSON 库表示 JSON 数组的方式。
2天后我终于找到了错误。我在名为 OpenComputers 的 Minecraft Mod 工作,它使用 Lua。似乎 mod 使用自己的 socket.http 版本,每次我想打印响应时,它都会返回两个函数以用于请求。我发现,如果我在变量后面放一个“()”,它会以字符串形式返回响应,并且使用 JSON 库,我可以将它解码为可用的 table.
旁注:我可以这样访问天气:json_table["weather"]["temp"]
mod 在 http 请求上的记录非常少,所以我不得不通过 myslef 解决这个问题。感谢您的回复,最后的错误一如既往的出乎意料!