Pular para conteúdo

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.