jq: Vinculações FFI do LuaJIT para jq
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, 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-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 com NGINX, certifique-se de que o nginx-module-lua esteja instalado.
Este documento descreve lua-resty-jq v0.2.0 lançado em 06 de junho de 2025.
lua-resty-jq é um pequeno wrapper FFI do LuaJIT para jq
Olá Mundo com 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()
Executar o código acima irá produzir (ou algo semelhante):
[
{
"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()
Aloca um contexto libjq.
teardown
syntax: jq:teardown()
Destrói o contexto libjq, liberando recursos.
compile
syntax: ok, err = jq:compile(program)
Retorna true se o programa foi compilado, caso contrário, retorna nil e o erro compilation failed.
Observe que atualmente não é possível inspecionar detalhes do erro de compilação. Se tiver dúvidas, experimente seu programa na CLI jq.
filter
syntax: res, err = jq:filter(data, options)
Filtra data usando o programa previamente compilado. A tabela options pode conter flags que alteram o comportamento do filtro, semelhante a um subconjunto das opções da CLI para jq:
compact_output: Retorna a saída em uma forma compacta sem espaçamento adicional, e com cada objeto JSON em uma única linha. O padrão étrue. Defina comofalsepara uma saída "bonita".raw_output: Saídas como strings brutas, não JSON entre aspas. O padrão éfalse.join_output: Comoraw_output, mas além disso não produz separadores de nova linha. O padrão éfalse.ascii_output: jq geralmente produz pontos de código Unicode não-ASCII como UTF-8, mesmo que a entrada os especifique como sequências de escape (como "\u03bc"). Usando esta opção, você pode forçar jq a produzir saída puramente ASCII com cada caractere não-ASCII substituído pela sequência de escape equivalente. O padrão éfalse.sort_keys: Saída dos campos de cada objeto com as chaves em ordem classificada. O padrão éfalse.table_output: Retorna uma tabela semelhante a uma sequência de resultados codificados em vez de concatená-los em uma única string. O padrão éfalse.
Além disso, filter() aceita uma tabela como um terceiro argumento opcional. Quando fornecida, esta tabela será usada para armazenar resultados em vez de criar uma nova tabela para cada chamada a filter():
local buf = {}
local res, err = jq:filter(data, nil, buf)
for _, elem in ipairs(buf) do
-- ...
end
Fazer isso implica options.table_output = true, então esta opção deve ser explicitamente definida como false para receber um resultado em string:
local buf = {}
local res, err = jq:filter(data, { table_output = false }, buf)
print(res)
NOTA: filter() adiciona um nil ao final da tabela de modo que o operador de comprimento (#buf) e ipairs(buf) retornem resultados precisos após a execução, mas não limpa a tabela. Os chamadores devem limpar a tabela por conta própria, se desejado.
Veja Também
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-jq.