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.