jq es una utilidad de línea de comandos ampliamente utilizada y un lenguaje de programación funcional de muy alto nivel , específico de dominio, diseñado para procesar datos JSON . jq filtra sus datos de entrada para producir una salida modificada de manera similar a AWK o sed . La entrada generalmente consiste en uno o más valores JSON, pero también puede consistir en una o más líneas de texto. En jq, los programas consisten en filtros que se pueden combinar en secuencias de procesamiento que realizan diversas operaciones sobre sus entradas. [ 3 ] [ 4 ]
Historia
jq fue creado por Stephen Dolan y lanzado en octubre de 2012. [ 5 ] [ 6 ] Fue descrito como "similar a sed para datos JSON". [ 7 ] El soporte para expresiones regulares se agregó en la versión 1.5 de jq.
La implementación original de jq estaba en Haskell [ 8 ] antes de ser portada al lenguaje C .
El lenguaje jq se implementó posteriormente en otros lenguajes de programación:
Usar
Uso de la línea de comandos
jq se usa normalmente en la línea de comandos y puede utilizarse con otras utilidades de línea de comandos, como GNU Wget . Aquí hay un ejemplo que muestra cómo wgetse puede redirigir la salida de un comando a un filtro jq para determinar los nombres de las categorías asociadas con esta página de Wikipedia :
$ wget -qO- 'https://en.wikipedia.org/w/api.php?action=parse&page=jq_(programming_language)&format=json' | jq '.parse.categories[]."*"'La salida producida por esta canalización consiste en una secuencia de cadenas JSON, las primeras de las cuales son:
"CS1_errors:_missing_title" "CS1_errors:_bare_URL" "Artículos_con_descripción_corta" " La_descripción_corta_coincide_con_Wikidata" "Sitio_web_oficial_no_en_Wikidata" "Lenguajes_de_programación_tipados_dinámicamente" "Lenguajes_funcionales" "Lenguajes_de_programación" " Lenguajes_de_programación_creados_en_2012" "Lenguajes_de_consulta" "Software_2012" "Artículos_con_código_de_ejemplo"El wgetcomando anterior utiliza la API de MediaWiki para esta página para producir una respuesta JSON. La tubería| permite que jq, un mecanismo estándar de la shell de Unix,wget acceda a la salida . [ 12 ]
El filtro jq que se muestra es una abreviatura de la canalización jq:
.["parse"] | .["categories"] | .[] | .["*"] Esto corresponde a la estructura JSON anidada producida por la llamada a wget. Nótese que la tubería jq se construye de la misma manera usando el |carácter que la tubería de estilo Unix.
Uso integrado
jq proporciona una API de C , libjq, que permite utilizarlo desde C. [ 4 ]
Modos de funcionamiento
jq actúa por defecto como un "editor de flujo" para entradas JSON, de forma similar a como la utilidad sed puede considerarse un "editor de flujo" para líneas de texto. Sin embargo, jq tiene varios otros modos de funcionamiento:
- puede tratar la información que recibe de una o más fuentes como líneas de texto;
- Puede recopilar un flujo de datos de entrada desde una fuente específica en una matriz JSON;
- Puede analizar sus entradas JSON utilizando un llamado "analizador de flujo" que produce un flujo de matrices [ruta, valor] para todas las rutas "hoja".
El analizador de flujo es muy útil cuando una o más entradas JSON son demasiado grandes para caber en la memoria, ya que sus necesidades de memoria suelen ser bastante bajas. Por ejemplo, para una matriz arbitrariamente grande de objetos JSON, la necesidad máxima de memoria es poco más que la necesaria para procesar el objeto de nivel superior más grande.
Estos modos de funcionamiento pueden combinarse, dentro de ciertas limitaciones.
Sintaxis y semántica
Tipos
Cada valor JSON es también un valor en jq, que en consecuencia tiene los tipos de datos que se muestran en la tabla siguiente. [ 4 ]
nulles un valor, al igual que cualquier otro escalar JSON; no es un puntero ni un " puntero nulo ". nan(correspondiente a NaN ) y infinite(ver IEEE 754 ) son los únicos dos escalares jq que no son también valores JSON.
Formularios
Existen formas sintácticas especiales para la creación de funciones, condicionales, reducción de flujo y el sistema de módulos.
Filtros
Aquí se muestra un ejemplo de cómo definir un filtro con nombre y parametrizado para formatear un número entero en cualquier base desde 2 hasta 36 inclusive. La implementación ilustra la programación tácita (o sin puntos) :
def tobase($b): dígito def: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[.:.+1]; def mod: . % $b; def div: ((. - mod) / $b); def dígitos: recurse( select(. >= $b) | div) | mod ; seleccionar(2 <= $b y $b <= 36) | [dígitos | dígito] | invertir | sumar; El siguiente ejemplo demuestra el uso de generadores en el clásico juego de aritmética verbal "ENVÍA MÁS DINERO" :
def enviar_más_dinero: def choose(m;n;usado): ([rango(m;n+1)] - usado)[]; def num(a;b;c;d): 1000*a + 100*b + 10*c + d; def num(a;b;c;d;e): 10*num(a;b;c;d) + e; primero( 1 como $m | 0 como $o | elegir(8;9;[]) como $s | elegir(2;9;[$s]) como $e | elegir(2;9;[$s,$e]) como $n | elegir(2;9;[$s,$e,$n]) como $d | elegir(2;9;[$s,$e,$n,$d]) como $r | elegir(2;9;[$s,$e,$n,$d,$r]) como $y | seleccionar(num($s;$e;$n;$d) + num($m;$o;$r;$e) == num($m;$o;$n;$e;$y)) | [$s,$e,$n,$d,$m,$o,$r,$e,$m,$o,$n,$e,$y] ); Software relacionado
jq ha inspirado varios clones y programas similares.
gojq reimplementa gran parte de jq en Go . [ 13 ] También admite el procesamiento de archivos YAML .
jaq es una implementación en Rust de jq desarrollada utilizando semántica denotacional para formalizar su comportamiento en casos donde la documentación original de jq no es clara o no coincide con su comportamiento. [ 13 ]
yq de Mike Farah es un programa similar a jq que admite varios formatos de archivo, incluidos JSON, YAML y XML. [ 14 ] Su sintaxis no es totalmente compatible con jq. [ 13 ]
yq de Andrey Kislyuk proporciona una colección de scripts envoltorio que utilizan jq para procesar archivos YAML, XML o TOML . [ 15 ] [ 16 ]
Notas
- ↑ Incluye, pero no se limita a.
Referencias
Bibliografía
- Janssens, Jeroen (2021). Ciencia de datos en la línea de comandos . O'Reilly Media . ISBN 9781492087885.
- Janssens, Jeroen (2014). Ciencia de datos en la línea de comandos: Enfrentando el futuro con herramientas probadas . O'Reilly Media . ISBN 9781491947807.
- Marrs, Tom (2017). JSON en acción: Integración práctica de datos para la web . O'Reilly Media . ISBN 9781491982419.
Otros
- ↑ https://github.com/jqlang/jq .
{{cite web}}: Falta o está vacío|title=( ayuda ) - 1 2 "Descargar jq" . jq . Archivado del original el 10 de septiembre de 2025. Recuperado el 27 de septiembre de 2025 .
- ↑ Homer, Michael (19 de octubre de 2023). Transformaciones de datos composicionales ramificadas en jq, Visually . Actas del 2.º Taller Internacional ACM SIGPLAN sobre Abstracciones de Programación y Notaciones, Herramientas y Entornos Interactivos . Nueva York: Association for Computing Machinery. págs. 11–16 . doi : 10.1145/3623504.3623567 . ISBN 9798400703997Consultado el 27 de septiembre de 2025 .
- 1 2 3 "Manual de jq 1.8" . jq . Archivado del original el 16 de septiembre de 2025. Recuperado el 27 de septiembre de 2025 .
- ↑ Janssens 2014 .
- ↑ "jqlang" . GitHub . Consultado el 6 de enero de 2023 .
- ↑ "like sed" . Archivado del original el 14 de abril de 2013.
- ↑ "Inicial: jqlang/Jq@eca89ac" . GitHub : jqlang .
- ↑ "Versión v0.0.1 · itchyny/gojq" . GitHub .
- ↑ "01mf02/jaq: Un clon de jq centrado en la corrección, la velocidad y la simplicidad" . GitHub . Consultado el 6 de marzo de 2024 .
- ^ Wadman, Mattias (2022). "jqjq: implementación jq de jq" . GitHub . GitHub, Inc. Consultado el 22 de enero de 2026 .
- ↑ "Tutorial" . jq . Consultado el 6 de enero de 2023 .
- 1 2 3 Färber, Michael (2023). "Semántica denotacional y un intérprete rápido para jq". arXiv : 2302.10576 [ cs.LO ].
- ↑ Farah, Mike. "yq" . yq . Archivado del original el 20 de agosto de 2025. Recuperado el 27 de septiembre de 2025 .
- ↑ Asher, Ben (9 de enero de 2022). "Consultas JSON y XML con jq y xq" . Ashby . Archivado del original el 29 de abril de 2025. Recuperado el 27 de septiembre de 2025 .
- ↑ Andrey, Kislyuk. "yq: Procesador de YAML/XML/TOML de línea de comandos: envoltorio jq para documentos YAML, XML y TOML" . Documentación de yq . Archivado del original el 26 de agosto de 2025. Consultado el 27 de septiembre de 2025 .
Enlaces externos
- Sitio web oficial
- Preguntas frecuentes en GitHub – Preguntas frecuentes de jq
- La página del lenguaje de programación jq en el sitio web del proyecto de tareas de programación comparativa Rosetta Code.
- Lenguajes de programación de tipado dinámico
- Lenguajes funcionales
- Lenguajes de programación
- Lenguajes de programación creados en 2012
- Lenguajes de consulta
- Software de 2012