Доступ Lua зависит от таблицы, сгенерированной из JSON
Итак, я обязан использовать Lua для получения данных о погоде из Openweathermap API. Мне удалось отправить запрос http, чтобы вернуть и сохранить все данные, но теперь я застрял с таблицей Lua, с которой я не знаю, как работать. Я очень новичок в Lua, и я не нашел никакого руководства или подобного в отношении такого глубокого вложенного стола в Lua.
В частности, меня просто интересует область, которая называется temp in main. Вот пример ответа от API: Пример ответа на запрос
Зависимости - это файл Lua socket.http и форматер таблицы json to Lua. Вот моя основная структура кода
json = require ("json")
web = require ("socket.http")
local get = json.decode(web.request(<API Link>))
"get" теперь хранит таблицу, с которой я не знаю, как работать
4 ответа
Через 2 дня я наконец нашел ошибку. Я работал в моде Minecraft под названием OpenComputers, который использует Lua. Кажется, что мод использует собственную версию socke t.http, и каждый раз, когда я хотел напечатать ответ, он возвращал две функции для использования с запросом. Я обнаружил, что если я поставлю "()" после переменной, она вернет Response в виде строки, а с помощью библиотеки JSON я смогу декодировать ее в работоспособную таблицу.
Примечание: я мог получить доступ к погоде следующим образом: json_table["weather"]["temp"]
Мод довольно плохо документирован на http-запросах, поэтому мне пришлось разобраться с этим по myslef. Спасибо за ваши ответы, в конце концов ошибка была как всегда очень неожиданной!
С помощью 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.
Если вы не знаете, как работать с таблицами 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": "Тест", "б":[1,2],"а":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"
}
}
Этот пример ответа, как представляется, имеет много подтаблиц, которые имеют main
в них. Попробуй это: get.list[1].main.temp
,