Saltar a contenido

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.