【问题标题】:Lua access indeces from table generated from JSON从 JSON 生成的表中的 Lua 访问索引
【发布时间】:2019-03-16 15:21:12
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: json lua decode lua-table opencomputers


    【解决方案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 数组的方式。

    【讨论】:

    • 这返回了两个适用于请求的函数,我使用了:web.request(URL)()
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        该模块在 http 请求上的记录非常差,所以我不得不通过 myslef 来解决这个问题。感谢您的回复,最后还是出乎意料的错误!

        【讨论】:

        • () 尝试将值作为函数调用。 (它在一个表达式之后,其中一个变量是一个特例。)
        • 我并不真正了解这个概念,因为我主要用 Java 编写代码,所以感谢您澄清这一点
        • 是的,函数就是值,当尝试将值作为函数调用时,您可以传递您认为合适的任何零个或多个参数列表。结果将是一个包含零个或多个值的列表,可能每次调用都有一个不同的数字。所以,你是对的;文档非常重要。
        • 下次您可以简单地分享错误消息...错误:尝试索引函数值与“我不知道如何使用 Lua 表”不同。如果您不确定函数返回什么类型,只需打印函数调用
        • @Piglet 奇怪的是它没有打印函数,而是一个包含两个函数的表。所以它向我显示为一个表格,我认为该请求将 JSON 作为一个表格获取。没有错误,因为我不知道密钥,所以我无法访问任何值。在我使用对之后,它打印了两个函数定义,因为我期望 JSON 条目,所以我感到困惑
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-11
        • 2021-12-17
        • 2021-03-11
        • 1970-01-01
        • 2016-03-31
        • 1970-01-01
        • 2012-11-20
        相关资源
        最近更新 更多