Перейти к содержанию

libcjson: Библиотека cJSON на основе LuaJIT FFI для nginx-module-lua

Установка

Если вы еще не подписались на репозиторий RPM, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-libcjson

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-libcjson

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-libcjson v1.4, выпущенную 4 июля 2016 года.


lua-resty-libcjson — это библиотека cJSON на основе LuaJIT FFI (также протестирована с OpenResty).

Lua API

mixed json.decode(value)

Декодирует значение или структуру JSON (массив или объект JSON) и возвращает либо таблицу Lua, либо какое-то простое значение (например, boolean, string, number, nil или json.null (при выполнении в контексте OpenResty json.null равен ngx.null).

Пример
local json = require "resty.libcjson"
local obj = json.decode "{}"       -- table (с obj.__jsontype == "object")
local arr = json.decode "[]"       -- table (с arr.__jsontype == "array")
local nbr = json.decode "1"        -- 1
local bln = json.decode "true"     -- true
local str = json.decode '"test"'   -- "test"
local str = json.decode '""'       -- ""
local num = json.decode(5)         -- 5
local num = json.decode(math)      -- math
local num = json.decode(json.null) -- json.null
local nul = json.decode "null"     -- json.null
local nul = json.decode ""         -- nil
local nul = json.decode(nil)       -- nil
local nul = json.decode()          -- nil

Вложенные структуры JSON разбираются как вложенные таблицы Lua.

string json.encode(value, formatted)

Кодирует значение или таблицу Lua и возвращает эквивалентное значение или структуру JSON в виде строки. Опционально вы можете передать аргумент formatted со значением false, чтобы получить неформатированную строку JSON в качестве результата.

Пример
local json = require "resty.libcjson"
local str = json.encode{}                              -- "[]"
local str = json.encode(setmetatable({}, json.object)) -- "{}"
local str = json.encode(1)                             -- "1"
local str = json.encode(1.1)                           -- "1.100000"
local str = json.encode "test"                         -- '"test"'
local str = json.encode ""                             -- '""'
local str = json.encode(false)                         -- "false"
local str = json.encode(nil)                           -- "null"
local str = json.encode(json.null)                     -- "null"
local str = json.encode()                              -- "null"
local str = json.encode{ a = "b" }                     -- '{ "a": "b" }'
local str = json.encode{ "a", b = 1 }                  -- '{ "1": "a", "b": 1 }'
local str = json.encode{ 1, 1.1, "a", "", false }      -- '[1, 1.100000, "a", "", false]'

Вложенные таблицы Lua кодируются как вложенные структуры JSON (объекты или массивы JSON).

О кодировании и декодировании массивов и объектов JSON

Смотрите этот комментарий: https://github.com/bungle/lua-resty-libcjson/issues/1#issuecomment-38567447.

Бенчмарки

Около 190 МБ citylots.json:

## Lua cJSON
Время декодирования: 5.882825
Время кодирования: 4.902301
## lua-resty-libcjson
Время декодирования: 6.409872
Время кодирования: (занимает вечность)

GitHub

Вы можете найти дополнительные советы по настройке и документацию для этого модуля в репозитории GitHub для nginx-module-libcjson.