Кодирование JSON
Кодирование JSON
Заголовок раздела «Кодирование 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}'| Параметр | Тип | Описание |
|---|---|---|
value | any | Lua-значение для кодирования |
Возвращает: 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, errendprint(user.name) -- "Bob"print(user.active) -- true
-- Разбор массиваlocal items = json.decode('[10, 20, 30]')print(items[1]) -- 10print(#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| Параметр | Тип | Описание |
|---|---|---|
str | string | JSON-строка для разбора |
Возвращает: 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)| Параметр | Тип | Описание |
|---|---|---|
schema | table или string | Определение JSON Schema |
data | any | Проверяемое значение |
Возвращает: boolean, error
Схемы кэшируются по хешу содержимого для производительности.
Проверка JSON-строки
Заголовок раздела «Проверка JSON-строки»Проверяет 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)| Параметр | Тип | Описание |
|---|---|---|
schema | table или string | Определение JSON Schema |
json_str | string | JSON-строка для проверки |
Возвращает: boolean, error
| Условие | Kind | Повторяемо |
|---|---|---|
| Рекурсивная ссылка в таблице | errors.INTERNAL | нет |
| Разреженный массив (пропуски) | errors.INTERNAL | нет |
| Смешанные типы ключей | errors.INTERNAL | нет |
| Вложенность превышает 128 уровней | errors.INTERNAL | нет |
| Неверный синтаксис JSON | errors.INTERNAL | нет |
| Ошибка компиляции схемы | errors.INVALID | нет |
| Ошибка валидации | errors.INVALID | нет |
См. Обработка ошибок для работы с ошибками.