libcjson: biblioteca cJSON basada en FFI de LuaJIT para nginx-module-lua
Instalación
Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.
CentOS/RHEL 7 o 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 con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-libcjson v1.4 lanzado el 04 de julio de 2016.
lua-resty-libcjson es una biblioteca cJSON basada en FFI de LuaJIT (también probada con OpenResty).
API de Lua
mixed json.decode(value)
Decodifica un valor o estructura JSON (array o objeto JSON), y devuelve ya sea una table de Lua o algún valor simple (por ejemplo, boolean, string, number, nil o json.null (cuando se ejecuta en el contexto de OpenResty, json.null es lo mismo que ngx.null).
Ejemplo
local json = require "resty.libcjson"
local obj = json.decode "{}" -- table (con obj.__jsontype == "object")
local arr = json.decode "[]" -- table (con 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
Las estructuras JSON anidadas se analizan como tablas Lua anidadas.
string json.encode(value, formatted)
Codifica un valor o tabla Lua, y devuelve un valor o estructura JSON equivalente como una cadena. Opcionalmente, puedes pasar el argumento formatted con el valor de false para obtener una cadena JSON sin formato como salida.
Ejemplo
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]'
Las tablas Lua anidadas se codifican como estructuras JSON anidadas (objetos o arrays JSON).
Acerca de la codificación y decodificación de arrays y objetos JSON
Consulta este comentario: https://github.com/bungle/lua-resty-libcjson/issues/1#issuecomment-38567447.
Benchmarks
Acerca de 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
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-libcjson.