libcjson: biblioteca cJSON baseada em FFI do LuaJIT para nginx-module-lua
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Então você pode prosseguir com os seguintes passos.
CentOS/RHEL 7 ou 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
Para usar esta biblioteca Lua com o NGINX, certifique-se de que o nginx-module-lua está instalado.
Este documento descreve lua-resty-libcjson v1.4 lançado em 04 de julho de 2016.
lua-resty-libcjson é uma biblioteca cJSON baseada em FFI do LuaJIT (testada também com OpenResty).
API Lua
mixed json.decode(value)
Decodifica um valor ou estrutura JSON (array ou objeto JSON) e retorna uma table Lua ou algum valor simples (por exemplo, boolean, string, number, nil ou json.null (quando executado no contexto do OpenResty, json.null é o mesmo que ngx.null).
Exemplo
local json = require "resty.libcjson"
local obj = json.decode "{}" -- table (com obj.__jsontype == "object")
local arr = json.decode "[]" -- table (com 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
Estruturas JSON aninhadas são analisadas como tabelas Lua aninhadas.
string json.encode(value, formatted)
Codifica um valor ou tabela Lua e retorna o valor ou estrutura JSON equivalente como uma string. Opcionalmente, você pode passar o argumento formatted com o valor false para obter uma string JSON não formatada como saída.
Exemplo
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]'
Tabelas Lua aninhadas são codificadas como estruturas JSON aninhadas (objetos ou arrays JSON).
Sobre Codificação e Decodificação de Arrays e Objetos JSON
Veja este comentário: https://github.com/bungle/lua-resty-libcjson/issues/1#issuecomment-38567447.
Benchmarks
Sobre 190 MB citylots.json:
## Lua cJSON
Decoding Time: 5.882825
Encoding Time: 4.902301
## lua-resty-libcjson
Decoding Time: 6.409872
Encoding Time: (takes forever)
GitHub
Você pode encontrar dicas de configuração adicionais e documentação para este módulo no repositório GitHub para nginx-module-libcjson.