jq: Enlaces FFI de LuaJIT a jq
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-jq
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-jq
Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-jq v0.2.0 lanzado el 06 de junio de 2025.
lua-resty-jq es un pequeño envoltorio FFI de LuaJIT para jq
Hola Mundo con lua-resty-jq
-- <example-input> de https://api.github.com/repos/stedolan/jq/commits?per_page=5
local jq = require "resty.jq".new()
jq:compile("[ .[] | {message: .commit.message, name: .commit.committer.name} ]")
local output = jq:filter(<example-input>)
print(output)
jq:teardown()
Ejecutar el código anterior producirá (o similar):
[
{
"message": "Add some missing code quoting to the manual",
"name": "William Langford"
},
{
"message": "Reduce allocation on string multiplication",
"name": "William Langford"
},
{
"message": "Fix multiple string multiplication",
"name": "William Langford"
},
{
"message": "Fix error handling in strftime",
"name": "William Langford"
},
{
"message": "Makefile: prepend srcdir to jq.1.prebuilt to fix out of source compilation",
"name": "William Langford"
}
]
new
syntax: jq, err = require("resty.jq").new()
Asigna un contexto libjq.
teardown
syntax: jq:teardown()
Destruye el contexto libjq, liberando recursos.
compile
syntax: ok, err = jq:compile(program)
Devuelve true si el programa fue compilado, de lo contrario nil y el error compilation failed.
Ten en cuenta que actualmente no es posible inspeccionar los detalles del error de compilación. Si tienes dudas, prueba tu programa en la CLI jq.
filter
syntax: res, err = jq:filter(data, options)
Filtra data utilizando el programa previamente compilado. La tabla options puede contener banderas que alteran el comportamiento del filtro, similar a un subconjunto de las opciones de la CLI para jq:
compact_output: Devuelve la salida en una forma compacta sin espacios adicionales, y con cada objeto JSON en una sola línea. Por defecto estrue. Establece enfalsepara una salida "bonita".raw_output: Salida como cadenas sin procesar, no JSON entre comillas. El valor por defecto esfalse.join_output: Comoraw_outputpero además no produce separadores de nueva línea. El valor por defecto esfalse.ascii_output: jq generalmente produce puntos de código Unicode no ASCII como UTF-8, incluso si la entrada los especifica como secuencias de escape (como "\u03bc"). Usando esta opción, puedes forzar a jq a producir salida ASCII pura con cada carácter no ASCII reemplazado por la secuencia de escape equivalente. El valor por defecto esfalse.sort_keys: Salida de los campos de cada objeto con las claves en orden ordenado. El valor por defecto esfalse.table_output: Devuelve una tabla similar a una secuencia de resultados codificados en lugar de concatenarlos en una sola cadena. El valor por defecto esfalse.
Además, filter() toma una tabla como un tercer argumento opcional. Cuando se proporciona, esta tabla se utilizará para almacenar resultados en lugar de crear una nueva tabla para cada llamada a filter():
local buf = {}
local res, err = jq:filter(data, nil, buf)
for _, elem in ipairs(buf) do
-- ...
end
Hacer esto implica options.table_output = true, por lo que esta opción debe establecerse explícitamente en false para recibir un resultado de cadena:
local buf = {}
local res, err = jq:filter(data, { table_output = false }, buf)
print(res)
NOTA: filter() agrega un nil al final de la tabla de modo que el operador de longitud (#buf) y ipairs(buf) devuelvan resultados precisos después de la ejecución, pero no limpia la tabla. Los llamadores deben limpiar la tabla ellos mismos si lo desean.
Ver También
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-jq.