3 puntos por GN⁺ 2023-11-30 | 1 comentarios | Compartir por WhatsApp

Introducción a jaq

  • jaq es un clon de jq, la herramienta para procesar datos JSON, y busca ser compatible con gran parte de la sintaxis y las operaciones de jq.
  • Los tres objetivos principales de jaq son la precisión, el rendimiento y la simplicidad.
  • Busca mantener la compatibilidad con jq mientras ofrece una implementación más precisa y predecible.
  • Algunos ejemplos de comportamientos inesperados de jq son que nan > nan es falso y nan < nan es verdadero, y que ejecutar jq con [[[]] | implode provoca un fallo.
  • Fue desarrollado como respuesta al largo tiempo de arranque de jq, y presume un inicio unas 30 veces más rápido que jq 1.6.
  • jaq apunta a tener una implementación simple y pequeña para reducir la posibilidad de errores y facilitar las contribuciones.

Cómo instalarlo

Instalar desde el código fuente

  • Se necesita la toolchain de Rust para compilar jaq.
  • El compilador de Rust incluido en distribuciones de Linux puede ser demasiado antiguo y no adecuado para compilar jaq.
  • Se puede instalar jaq con los comandos cargo install --locked jaq o cargo install --locked --git https://github.com/01mf02/jaq.
  • jaq debería funcionar en todos los sistemas compatibles con Rust; si no es así, se debe reportar un issue.

Instalar binarios

  • En macOS o Linux se puede instalar jaq usando Homebrew.

Ejemplos

  • Los siguientes ejemplos muestran lo que jaq puede hacer actualmente.
  • Si se ejecuta echo '{"a": 1, "b": 2}' | jaq '.a', la salida es 1.
  • Si se ejecuta echo '{"a": 1, "b": 2}' | jaq 'add', la salida es 3.
  • Si se ejecuta echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]', la salida es [0, 2, 4].

Rendimiento

  • Se compara el rendimiento de jaq, jq y gojq mediante varios benchmarks.
  • El benchmark empty se usa para medir el tiempo de arranque.
  • El benchmark bf-fib ejecuta un intérprete de Brainfuck escrito en jq sobre un script de Brainfuck que genera números de Fibonacci.
  • Los otros benchmarks evalúan varios filtros con un valor de entrada n.
  • Los resultados muestran que jaq-1.2 fue el más rápido en 16 benchmarks, jq-1.7 en 2 y gojq-0.12.13 en 1.

Funciones

Funciones básicas

  • Soporta varias funciones básicas, incluidos tipos de datos fundamentales, condicionales, acceso, operadores, manejo de errores, interpolación de cadenas y cadenas de formato.

Rutas

  • Soporta indexación de arreglos/objetos, iteración, indexación/iteración opcional, slices de arreglos y slices de cadenas.

Operadores

  • Soporta operadores de composición, binding, concatenación, asignación, actualización con asignación, alternativa, lógica, igualdad y comparación, aritmética, negación y supresión de errores.

Definiciones

  • Soporta definiciones básicas y definiciones recursivas.

Filtros principales

  • Soporta varios filtros principales.

Filtros estándar

  • Los filtros estándar se definen a través de filtros más básicos.

Filtros numéricos

  • Soporta muchos filtros tomados de libm.

Funciones avanzadas

  • Algunas funciones de jq no están soportadas, como módulos, operadores estilo SQL y streaming.

Diferencias entre jq y jaq

Números

  • Mientras jq usa todos los números como punto flotante de 64 bits, jaq distingue entre enteros y punto flotante.

NaN e infinito

  • jaq ofrece un comportamiento más cercano al estándar IEEE 754 de aritmética de punto flotante.

Preservación de números fraccionarios

  • jaq preserva perfectamente los números fraccionarios que provienen de datos JSON.

Asignación

  • jaq interpreta la asignación de manera distinta a jq.

Definiciones

  • jaq permite definiciones de filtros y, al igual que jq, puede pasar argumentos por valor.

Argumentos

  • jaq puede definir argumentos a través de la línea de comandos.

Reducción

  • jaq ofrece los filtros reduce y foreach, con una interpretación distinta a la de jq.

Manejo de errores

  • jaq usa un mecanismo de manejo de errores distinto al de jq.

Otros

  • jq y jaq muestran comportamientos diferentes en slurping, producto cartesiano, actualización de listas, lectura de entrada, joins y otros casos.

Contribuciones

  • Las contribuciones a jaq son bienvenidas, y después de hacer cambios se debe comprobar que cargo test se ejecute correctamente.

Agradecimientos

  • jaq se ha beneficiado enormemente de varias librerías y de la biblioteca estándar de Rust.

Opinión de GN⁺

Lo más importante de este texto es que jaq busca soportar la mayor parte de la funcionalidad de jq mientras mejora el rendimiento y la precisión. En particular, su tiempo de arranque marcadamente más rápido frente a jq y su intención de reducir comportamientos inesperados pueden resultar muy atractivos para muchos usuarios. Además, al estar desarrollado sobre Rust, también ofrece ventajas en seguridad de memoria y rendimiento. Se espera que estas mejoras lo conviertan en una herramienta útil para ingenieros de software que necesiten procesar datos JSON.

1 comentarios

 
GN⁺ 2023-11-30
Comentarios de Hacker News
  • El bug de [[[]] | implode y la pausa en el desarrollo de jq

    • El desarrollo de jq estuvo detenido durante 5 años y se reanudó recientemente, por lo que errores conocidos desde hace mucho tiempo quedaron sin corregirse. Se espera que, con la reanudación del desarrollo, se resuelvan gradualmente los problemas acumulados.
  • Agradecimiento por recomendar otros proyectos

    • Es genial cuando un proyecto recomienda otros proyectos similares o que lo inspiraron. En particular, le agradó descubrir el proyecto jql.
  • Duda sobre el resultado de comparar nan > nan y nan < nan

    • Se plantea la duda de si en jq que nan > nan sea falso y nan < nan sea verdadero sigue fielmente el estándar de punto flotante IEEE 754 o si se trata de un bug.
  • Problema de jq al mostrar números uint64

    • Expresa molestia porque jq no muestra correctamente los números uint64.
  • Experiencia usando DuckDB en lugar de jq

    • jq es potente, pero comparte la experiencia de que, cuando los datos tienen forma tabular, usar SQL resulta más natural.
  • Señalamiento de que jaq tiene muchas dependencias

    • Señala que el proyecto jaq tiene muchas dependencias.
  • Pregunta sobre cómo se usa jq

    • Pregunta si jq se usa para explorar archivos JSON durante el desarrollo o el análisis de datos, o si se usa dentro de programas que corren en producción.
  • Experiencia usando yq en lugar de jq

    • Comparte que empezó a usar yq en lugar de jq, e intercambian opiniones sobre las principales diferencias entre ambas herramientas.
  • Cómo consultar datos en PowerShell

    • Con PowerShell, se pueden convertir todos los datos en objetos y consultarlos con la sintaxis de PowerShell, sin necesidad de aprender la sintaxis de varias herramientas como jq o xmlstarlet.
  • Opinión sobre lo críptico de la sintaxis y la documentación de jq

    • Considera que la sintaxis y la documentación de jq son difíciles de entender, y cree que eso no ha mejorado ni siquiera en las versiones nuevas. Sugiere que quizá sea mejor escribir algo propio.