Кодирование таблиц в JSON
Сериализуйте данные Lua.
«Кодирование таблиц в JSON» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Основы кодирования
Кодирование — обратная операция по отношению к декодированию: оно превращает таблицу Lua в строку JSON. Вызовите json.encode(table).
Результатом будет однострочная строка, которую можно записать в файл или отправить по сети.
local json = require("dkjson")
local t = { name = "Leo", age = 9 }
print(json.encode(t))Объекты и массивы
Способ кодирования таблицы Lua зависит от её ключей. Таблица с последовательными целочисленными ключами, начинающимися с 1, становится массивом JSON.
Таблица со строковыми ключами становится объектом JSON. Смешанные таблицы неоднозначны, поэтому их следует избегать.
local json = require("dkjson")
print(json.encode({ 1, 2, 3 })) -- [1,2,3]
print(json.encode({ a = 1, b = 2 })) -- {"a":1,"b":2}Форматирование
По умолчанию JSON имеет компактный вид. dkjson может добавить отступы в вывод, если передать таблицу параметров с indent = true.
Хорошо отформатированный вывод особенно удобен для конфигурационных файлов, которые будут редактировать люди.
local json = require("dkjson")
local t = { name = "Ann", roles = { "dev", "lead" } }
print(json.encode(t, { indent = true }))Кодирование чисел и логических значений
Числа и логические значения Lua напрямую кодируются в соответствующие значения JSON. И целые числа, и числа с плавающей точкой становятся числами JSON.
local json = require("dkjson")
local t = { count = 5, ratio = 1.5, active = true }
print(json.encode(t))Проблема nil
Нельзя сохранить nil в таблице, чтобы обозначить JSON null, потому что присваивание nil полностью удаляет ключ.
Чтобы вывести буквальное значение null, используйте специальное значение библиотеки json.null в качестве значения.
local json = require("dkjson")
local t = { middle = json.null }
print(json.encode(t)) -- {"middle":null}Разреженные массивы приводят к сбоям
Если в последовательности есть пропуск (например, индекс 2 имеет значение nil), Lua больше не считает её правильным массивом. Кодирование может остановиться на пропуске или повести себя неожиданно.
Для предсказуемых массивов JSON сохраняйте индексы массива последовательными, начиная с 1.
local json = require("dkjson")
local t = { [1] = "a", [3] = "c" } -- gap at 2
print(json.encode(t)) -- unreliableЗапись JSON в файл
Чтобы сохранить данные, закодируйте таблицу в строку и запишите эту строку в файл.
Так сохраняют настройки, результаты или любое структурированное состояние.
local json = require("dkjson")
local data = { theme = "dark", volume = 8 }
local f = io.open("settings.json", "w")
f:write(json.encode(data, { indent = true }))
f:close()Пустая таблица по умолчанию становится объектом
У пустой таблицы Lua {} нет ключей, поэтому по умолчанию dkjson кодирует её как пустой объект {}, а не как массив.
Если нужен пустой массив, dkjson позволяет пометить таблицу; в противном случае тип неоднозначен.
local json = require("dkjson")
print(json.encode({})) -- {}Порядок ключей не гарантируется
У таблиц Lua нет встроенного порядка строковых ключей, поэтому порядок полей в закодированном JSON может меняться.
Не полагайтесь на порядок полей: приложения, обрабатывающие JSON, должны искать ключи по имени, а не по позиции.
Согласованность при обратном преобразовании
После кодирования и последующего декодирования должна получиться эквивалентная таблица. Такое обратное преобразование — хороший способ протестировать обработку данных.
local json = require("dkjson")
local orig = { a = 1, list = { 2, 3 } }
local copy = json.decode(json.encode(orig))
print(copy.a, copy.list[2])Кодирование с помощью cjson
lua-cjson также предоставляет encode. Он работает быстрее, но предлагает меньше возможностей форматирования и вызывает ошибки вместо их возврата.
Для красиво отформатированного вывода с отступами обычно удобнее выбрать dkjson.
local cjson = require("cjson")
local s = cjson.encode({ ok = true, n = 42 })
print(s)Быстрая проверка
Проверьте, насколько хорошо Вы поняли кодирование таблиц Lua.
Итоги
Кодирование превращает таблицы Lua в строки JSON. Последовательности с целочисленными ключами становятся массивами, а таблицы со строковыми ключами — объектами.
Используйте json.null для буквальных значений null, сохраняйте непрерывность массивов и передавайте indent = true для удобного чтения вывода. Далее Вы разберёте глубоко вложенные данные.
Часто задаваемые вопросы
Урок «Кодирование таблиц в JSON» бесплатный?
Да — полный текст урока «Кодирование таблиц в JSON» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Кодирование таблиц в JSON»?
Сериализуйте данные Lua. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Кодирование таблиц в JSON»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужен JSON
- Декодирование JSON в таблицы
- Кодирование таблиц в JSON
- Работа с вложенными данными