Доступ Lua зависит от таблицы, сгенерированной из JSON - PullRequest
0 голосов
/ 16 марта 2019

Итак, я обязан использовать Lua для получения данных о погоде из API Openweathermap. Мне удалось отправить запрос http, чтобы вернуть и сохранить все данные, но теперь я застрял с таблицей Lua, с которой я не знаю, как работать. Я очень новичок в Lua, и я не нашел никакого руководства или подобного в отношении такого глубокого вложенного стола в Lua.

В частности, меня просто интересует область, называемая temp in main. Вот пример ответа от API: Пример ответа на запрос

Зависимости - это Lua socket.http и this json to Lua table formatter. Вот моя основная структура кода

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

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

"get" теперь хранит таблицу, с которой я не знаю, как работать

Ответы [ 4 ]

1 голос
/ 16 марта 2019

С помощью 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.

0 голосов
/ 17 марта 2019

Через 2 дня я наконец нашел ошибку.Я работал в моде Minecraft под названием OpenComputers, который использует Lua.Кажется, что мод использует собственную версию socket.http, и каждый раз, когда я хотел напечатать ответ, он возвращал две функции для использования с запросом.Я обнаружил, что если я добавлю «()» после переменной, она возвращает Response в виде строки, а с помощью библиотеки JSON я смогу декодировать ее в работоспособную таблицу.

Примечание: я могу получить доступ к погодевот так: json_table ["weather"] ["temp"]

Мод довольно плохо документирован по http-запросам, поэтому мне пришлось разобраться с этим с помощью myslef.Спасибо за ваши ответы, в конце концов ошибка была как всегда очень неожиданной!

0 голосов
/ 16 марта 2019

Если вы не знаете, как работать с таблицами 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}

и так далее ...

Всегда есть ключи и значения таблицы, разделенные двоеточием.Значения могут быть числами, строками, таблицами ... Если таблица содержит только цифровые ключи, начинающиеся с единицы, значение представляет собой список этих значений в скобках.Если у вас есть разные ключи в таблице, заключенной в фигурные скобки ...

Итак, давайте посмотрим на ваши результаты.Я удалю 39 из 40 записей, чтобы сократить его.Я также сделаю отступ, чтобы сделать структуру более читабельной.

{
  "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"
  }
}
0 голосов
/ 16 марта 2019

В этом образце ответа есть много подтаблиц, в которых есть main. Попробуйте это: get.list[1].main.temp.

...