Декодирование JSON в таблицы
Разбирайте строки JSON.
«Декодирование JSON в таблицы» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Основы декодирования
Декодирование превращает строку JSON в значение Lua, с которым можно работать. Точка входа — json.decode(text).
Если JSON верхнего уровня является объектом, Вы получаете таблицу Lua со строковыми ключами; если это массив — таблицу с числовыми индексами.
local json = require("dkjson")
local data = json.decode('{"id": 7}')
print(data.id)Чтение полей объекта
Декодированный объект JSON ведёт себя как любая таблица Lua. Получайте значения с помощью точечной или скобочной нотации.
Для ключей, которые не являются допустимыми идентификаторами Lua, например содержащих пробелы, необходим синтаксис со скобками.
local json = require("dkjson")
local u = json.decode('{"name": "Mia", "full name": "Mia Lee"}')
print(u.name)
print(u["full name"])Декодирование массивов
Массив JSON декодируется в таблицу Lua-последовательность с индексами, начинающимися с 1. Перебирайте её с помощью ipairs или цикла с числовым индексом.
Помните: массивы Lua начинаются с индекса 1, а не 0.
local json = require("dkjson")
local nums = json.decode('[10, 20, 30]')
for i, v in ipairs(nums) do
print(i, v)
endЧисла и логические значения
Числа JSON декодируются в числа Lua, а JSON true/false — в логические значения Lua.
После декодирования их можно непосредственно использовать в арифметических операциях или условных выражениях.
local json = require("dkjson")
local d = json.decode('{"qty": 3, "paid": false}')
if not d.paid then
print("unpaid, qty =", d.qty)
endОбработка нулевых значений
JSON null вызывает сложности, поскольку Lua nil удаляет ключ из таблицы. Библиотеки обрабатывают это по-разному.
dkjson декодирует null в специальное значение json.null, поэтому ключ сохраняется. Сравнивайте значение с ним, чтобы обнаружить нулевые значения.
local json = require("dkjson")
local d = json.decode('{"mid": null}')
if d.mid == json.null then
print("mid is null")
endДекодирование из файла
Часто JSON хранится в файле. Прочитайте весь файл в строку, а затем декодируйте её.
Этот подход часто используется для загрузки конфигурации или сохранённого состояния игры.
local json = require("dkjson")
local f = io.open("config.json", "r")
local text = f:read("*a")
f:close()
local cfg = json.decode(text)
print(cfg.theme)Три возвращаемых значения
Функция decode библиотеки dkjson возвращает до трёх значений: результат декодирования, позицию, на которой остановился разбор, и сообщение об ошибке.
При успешном выполнении результат присутствует, а при ошибке отсутствует; третье значение объясняет причину.
local json = require("dkjson")
local obj, pos, err = json.decode('{"a":1}')
print(obj.a, pos, err)Проверка входных данных
Никогда не доверяйте внешнему JSON. Всегда проверяйте результат перед использованием, чтобы некорректные данные не привели к аварийному завершению программы.
local json = require("dkjson")
local function safeDecode(s)
local v, _, err = json.decode(s)
if not v then return nil, err end
return v
endРазличия cjson
lua-cjson работает похожим образом, но при некорректных входных данных выдаёт ошибку вместо её возврата. Для безопасности оборачивайте вызов в pcall.
cjson работает быстрее, что важно при разборе больших объёмов данных.
local cjson = require("cjson")
local ok, data = pcall(cjson.decode, '{"x":1}')
if ok then print(data.x) else print("error") endОтсутствующие ключи дают нулевое значение
Если Вы обращаетесь к ключу, которого не было в JSON, Lua просто возвращает nil. Это нормально и не вызывает ошибки.
Используйте запасное значение с помощью or, чтобы задать значения по умолчанию для необязательных полей.
local json = require("dkjson")
local d = json.decode('{"name": "Sam"}')
local age = d.age or 0
print(d.name, age)Пустые таблицы неоднозначны
И пустой объект JSON {}, и пустой массив [] декодируются в пустую таблицу Lua. После декодирования невозможно определить, чем именно был исходный объект.
Это особенно важно при повторном кодировании; учитывайте такую неоднозначность при преобразовании туда и обратно.
Быстрая проверка
Проверьте, что Вы узнали о декодировании JSON.
Итоги
Декодирование преобразует текст JSON в таблицы Lua: объекты становятся таблицами со строковыми ключами, а массивы — последовательностями с индексами, начинающимися с 1.
Всегда проверяйте результат, обрабатывайте нулевые значения с помощью специального значения библиотеки и помните, что отсутствующие ключи просто дают нулевое значение. Далее Вы рассмотрите обратное преобразование таблиц Lua в JSON.
Часто задаваемые вопросы
Урок «Декодирование JSON в таблицы» бесплатный?
Да — полный текст урока «Декодирование JSON в таблицы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Декодирование JSON в таблицы»?
Разбирайте строки JSON. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Декодирование JSON в таблицы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужен JSON
- Декодирование JSON в таблицы
- Кодирование таблиц в JSON
- Работа с вложенными данными