0Pricing
Lua Academy · Урок

Работа с вложенными данными

Работайте со сложными структурами.

«Работа с вложенными данными» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Вложенные данные повсюду

Реальный JSON редко бывает плоским. Объекты содержат объекты, а массивы — объекты, часто на нескольких уровнях вложенности.

В Lua это означает таблицы внутри таблиц. Хорошая новость: decode и encode автоматически обрабатывают вложенность.

Объект внутри объекта

Когда значение JSON само является объектом, оно декодируется во вложенную таблицу Lua. Для перехода вглубь используйте цепочку обращений к полям.

local json = require("dkjson")
local d = json.decode('{"user": {"name": "Eve", "age": 30}}')
print(d.user.name)
print(d.user.age)

Массив объектов

Очень распространённая структура — массив объектов JSON, например список записей. Он декодируется в последовательность таблиц.

Используйте цикл с ipairs и считывайте поля каждого элемента.

local json = require("dkjson")
local d = json.decode('[{"id":1},{"id":2}]')
for _, item in ipairs(d) do
  print(item.id)
end

Доступ к глубоко вложенным данным

Цепочку можно продолжать настолько глубоко, насколько простираются данные. Каждый уровень — это всего лишь ещё один поиск в таблице.

Но если какой-либо промежуточный уровень отсутствует, цепочка завершается ошибкой «попытка обратиться по индексу к значению nil».

local json = require("dkjson")
local d = json.decode('{"a":{"b":{"c": 42}}}')
print(d.a.b.c)

Безопасный доступ к вложенным данным

Чтобы избежать сбоев при отсутствии уровней, проверяйте каждый шаг или используйте сокращённое вычисление с логическим оператором.

Цепочка с and останавливается на первом nil и возвращает nil вместо ошибки.

local json = require("dkjson")
local d = json.decode('{"a":{}}')
local c = d.a and d.a.b and d.a.b.c
print(c)  -- nil, no crash

Перебор вложенных массивов

Массивы могут содержать объекты, которые содержат другие массивы. Вложите циклы в соответствии со структурой данных.

local json = require("dkjson")
local d = json.decode('[{"tags":["a","b"]}]')
for _, rec in ipairs(d) do
  for _, tag in ipairs(rec.tags) do
    print(tag)
  end
end

Создание вложенных таблиц

Чтобы кодировать вложенный JSON, просто вкладывайте таблицы Lua друг в друга. Кодировщик рекурсивно обходит всю структуру.

local json = require("dkjson")
local t = {
  user = { name = "Jo", roles = { "admin", "editor" } }
}
print(json.encode(t, { indent = true }))

Изменение вложенных значений

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

local json = require("dkjson")
local d = json.decode('{"cfg":{"volume":5}}')
d.cfg.volume = 8
d.cfg.muted = false
print(json.encode(d))

Сочетание массивов и объектов

JSON свободно сочетает массивы и объекты на разных уровнях. Lua отражает это с помощью вложенных друг в друга таблиц-последовательностей и таблиц с ключами.

Просто убедитесь, что каждая таблица последовательно представляет собой одну структуру, а не другую.

local json = require("dkjson")
local t = {
  team = "red",
  members = { { id = 1 }, { id = 2 } }
}
print(json.encode(t))

Обход неизвестных структур

Если Вы заранее не знаете структуру, используйте type(), чтобы проверять каждое значение и рекурсивно обходить таблицы.

Это позволяет писать универсальные обработчики для произвольного JSON.

local function walk(v)
  if type(v) == "table" then
    for k, sub in pairs(v) do walk(sub) end
  else
    print(v)
  end
end

Следите за null во вложенных данных

Значение null глубоко внутри вложенных данных всё равно декодируется в json.null в dkjson. Учитывайте это при обходе структур, чтобы не принять его за настоящую таблицу или значение.

local json = require("dkjson")
local d = json.decode('{"a":{"b": null}}')
if d.a.b == json.null then
  print("b is null")
end

Быстрая проверка

Проверьте, насколько хорошо Вы умеете обрабатывать вложенный JSON в Lua.

Итоги

Вложенный JSON преобразуется в таблицы внутри таблиц; decode и encode берут рекурсию на себя.

Переходите вглубь с помощью цепочек обращений, но защищайтесь от отсутствующих уровней с помощью цепочек с логическим оператором. Создавайте вложенный вывод, вкладывая таблицы Lua, и помните о null и различии между массивом и объектом на каждом уровне.

Часто задаваемые вопросы

Урок «Работа с вложенными данными» бесплатный?

Да — полный текст урока «Работа с вложенными данными» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Работа с вложенными данными»?

Работайте со сложными структурами. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Работа с вложенными данными»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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