Перейти к содержимому

Кодирование JSON

Преобразование Lua-таблиц в JSON и разбор JSON-строк в Lua-значения. Включает валидацию по JSON Schema для проверки данных и контрактов API.

local json = require("json")

Преобразует Lua-значение в JSON-строку.

-- Простые значения
json.encode("hello") -- '"hello"'
json.encode(42) -- '42'
json.encode(true) -- 'true'
json.encode(nil) -- 'null'
-- Массивы (последовательные числовые ключи)
json.encode({1, 2, 3}) -- '[1,2,3]'
json.encode({"a", "b"}) -- '["a","b"]'
-- Объекты (строковые ключи)
local user = {name = "Alice", age = 30}
json.encode(user) -- '{"name":"Alice","age":30}'
-- Вложенные структуры
local order = {
id = "ord-123",
items = {
{sku = "ABC", qty = 2},
{sku = "XYZ", qty = 1}
},
total = 99.50
}
json.encode(order)
-- '{"id":"ord-123","items":[{"sku":"ABC","qty":2},{"sku":"XYZ","qty":1}],"total":99.5}'
ПараметрТипОписание
valueanyLua-значение для кодирования

Возвращает: string, error

Правила кодирования:

  • nil становится null
  • Пустые таблицы становятся [] (или {} при создании со строковыми ключами)
  • Таблицы с последовательными ключами от 1 становятся массивами
  • Таблицы со строковыми ключами становятся объектами
  • Смешанные числовые и строковые ключи вызывают ошибку
  • Разреженные массивы (пропуски в индексах) вызывают ошибку
  • Inf/NaN становятся null
  • Рекурсивные ссылки вызывают ошибку
  • Максимальная глубина вложенности — 128 уровней

Разбирает JSON-строку в Lua-значение.

-- Разбор объекта
local user, err = json.decode('{"name":"Bob","active":true}')
if err then
return nil, err
end
print(user.name) -- "Bob"
print(user.active) -- true
-- Разбор массива
local items = json.decode('[10, 20, 30]')
print(items[1]) -- 10
print(#items) -- 3
-- Разбор вложенных данных
local response = json.decode([[
{
"status": "ok",
"data": {
"users": [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
}
}
]])
print(response.data.users[1].name) -- "Alice"
-- Обработка ошибок
local data, err = json.decode("not valid json")
if err then
print(err:kind()) -- "INTERNAL"
print(err:message()) -- детали ошибки разбора
end
ПараметрТипОписание
strstringJSON-строка для разбора

Возвращает: any, error

Проверяет Lua-значение на соответствие JSON Schema. Используйте для контроля контрактов API или валидации пользовательского ввода.

-- Определение схемы
local user_schema = {
type = "object",
properties = {
name = {type = "string", minLength = 1},
email = {type = "string", format = "email"},
age = {type = "integer", minimum = 0, maximum = 150}
},
required = {"name", "email"}
}
-- Корректные данные проходят проверку
local valid, err = json.validate(user_schema, {
name = "Alice",
email = "alice@example.com",
age = 30
})
print(valid) -- true
-- Некорректные данные не проходят с подробностями
local valid, err = json.validate(user_schema, {
name = "",
email = "not-an-email"
})
if not valid then
print(err:message()) -- подробности ошибки валидации
end
-- Схема может быть JSON-строкой
local schema_json = '{"type":"number","minimum":0}'
local valid = json.validate(schema_json, 42)
ПараметрТипОписание
schematable или stringОпределение JSON Schema
dataanyПроверяемое значение

Возвращает: boolean, error

Схемы кэшируются по хешу содержимого для производительности.

Проверяет JSON-строку на соответствие схеме без предварительного разбора. Полезно для валидации до парсинга.

local schema = {
type = "object",
properties = {
action = {type = "string", enum = {"create", "update", "delete"}}
},
required = {"action"}
}
-- Валидация сырого JSON из тела запроса
local body = '{"action":"create","data":{}}'
local valid, err = json.validate_string(schema, body)
if not valid then
return nil, errors.new("INVALID", "Invalid request: " .. err:message())
end
-- Теперь можно безопасно разбирать
local request = json.decode(body)
ПараметрТипОписание
schematable или stringОпределение JSON Schema
json_strstringJSON-строка для проверки

Возвращает: boolean, error

УсловиеKindПовторяемо
Рекурсивная ссылка в таблицеerrors.INTERNALнет
Разреженный массив (пропуски)errors.INTERNALнет
Смешанные типы ключейerrors.INTERNALнет
Вложенность превышает 128 уровнейerrors.INTERNALнет
Неверный синтаксис JSONerrors.INTERNALнет
Ошибка компиляции схемыerrors.INVALIDнет
Ошибка валидацииerrors.INVALIDнет

См. Обработка ошибок для работы с ошибками.