0Pricing
Lua Academy · Урок

Декодирование 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 — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужен JSON
  2. Декодирование JSON в таблицы
  3. Кодирование таблиц в JSON
  4. Работа с вложенными данными
← Назад к Lua Academy