0

所以,我一定会使用 Lua 从 Openweathermap API 获取天气数据。我设法发送了一个 http 请求来返回和存储所有数据,但现在我被一个我不知道如何使用的 Lua 表困住了。我对 Lua 很陌生,我没有找到任何关于 Lua 中如此深的嵌套表的指南或类似内容。

特别是我只对 main 中称为 temp 的字段感兴趣。以下是来自 API 的示例响应:示例请求响应

依赖项是 Lua 的 socket.http 和这个json 到 Lua 表格式化程序。这是我的基本代码结构

json = require ("json")
web = require ("socket.http")

local get = json.decode(web.request(<API Link>))

“get”现在存储一个我不知道如何使用的表

4

4 回答 4

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 数组的方式。

于 2019-03-16T20:29:27.153 回答
1

如果您不知道如何使用 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}

等等...

总是有表键和值,用冒号分隔。值可以是数字、字符串、表格...如果表格只有从一个开始的数字键,则值是括号中这些值的列表。如果表中有不同的键,则将其封装在大括号中...

那么让我们来看看你的结果。我将删除 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"
  }
}
于 2019-03-16T20:22:21.267 回答
0

2天后,我终于找到了错误。我在一个名为 OpenComputers 的 Minecraft Mod 中工作,它使用了 Lua。似乎 mod 使用了自己的 socket.http 版本,每次我想打印响应时,它都会返回两个函数以用于请求。我发现如果我在变量后面加上一个“()”,它会以字符串的形式返回响应,并且使用 JSON 库我可以将它解码成一个可用的表。

旁注:我可以像这样访问天气:json_table["weather"]["temp"]

该 mod 在 http 请求上的记录很差,所以我不得不通过 myslef 来解决这个问题。感谢您的回复,最终错误总是非常意外!

于 2019-03-16T23:59:54.997 回答
0

该示例响应似乎有许多子表,其中包含一个main。试试这个:get.list[1].main.temp

于 2019-03-16T20:22:13.657 回答