Analizador JSON de línea de comandos de Unix? [cerrado]

128

¿Alguien puede recomendar un analizador JSON Unix (elija su sabor) que podría usarse para introspectar valores de una respuesta JSON en una tubería?

Jé Queue
fuente
Me gusta usar pythonpy ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
RussellStewart
1
Hay una nueva herramienta en la ciudad: ramda-cli , que utiliza la api cursada de Ramda y la sintaxis concisa de LiveScript. Está construido para tomar json como entrada y componer funciones. npm install -g ramda-cli
Ehvince

Respuestas:

18

Puede usar este analizador de línea de comandos (que podría poner en un alias bash si lo desea), usando módulos integrados en el núcleo de Perl:

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'
Éter
fuente
1
Estoy confundido por el resultado de esto. La salida incluye flechas gruesas (=>) entre claves y valores. Esto no es JSON.
Landon Kuhn
77
@landon: no, la entrada es JSON y la salida es una estructura de datos de Perl nativa, que luego puede manipular si es necesario. El punto de esta línea es que produce datos que son mucho más fáciles de leer.
Éter
1
Si desea una salida JSON, puede usar esta línea única de Perl:perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov
232

Prefiero python -m json.toolque parece estar disponible por defecto en la mayoría de los sistemas operativos * nix por defecto.

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

Pero debe tenerse en cuenta que esto ordenará todas las claves alfabéticamente, lo cual es o puede ser algo bueno en donde el json fue generado por algún lenguaje que usaba HashMaps desordenados ...

muhqu
fuente
55
Respuesta infravalorada. Esta es una buena alternativa de línea de comandos si el objetivo es validar un archivo JSON dado que contiene un JSON válido.
scorpiodawg
10
Esta respuesta no describe cómo inspeccionar los valores de la clave especificada.
Colin Su
8
@ColinSu pero esa tampoco era la pregunta original. json.tooles solo una mano corta para imprimir bastante json. Si necesita extraer / manipular datos json en un script de shell, usaría lo jqque es
absolutamente
@muhqu sí, lo sé, lo uso json.tooldiez veces al día. Creo que leí mal el significado de "introspec" en la pregunta, gracias por señalarme.
Colin Su
1
IMMO, esta es una respuesta incorrecta porque Python json.toolsolo hace dos cosas: validar y json de impresión bonita. NO introspecta valores en el json como lo jqhace.
Devy
144

Si está buscando una herramienta compilada C portátil:

http://stedolan.github.com/jq/

Desde el sitio web:

jq es como sed para datos JSON: puede usarlo para cortar, filtrar, mapear y transformar datos estructurados con la misma facilidad que sed , awk , grep y amigos le permiten jugar con texto.

jq puede alterar el formato de datos que tiene en el que desea con muy poco esfuerzo, y el programa para hacerlo a menudo es más corto y simple de lo que cabría esperar.

Tutorial : http://stedolan.github.com/jq/tutorial/
Manual : http://stedolan.github.com/jq/manual/
Descargar : http://stedolan.github.com/jq/download/

Daan Mortier
fuente
20
La mejor respuesta aquí. Sin dependencias pesadas, pequeña, potente, buena documentación y muy fácil de probar. Muchas gracias por sugerir esto!
FrozenCow
En Ubuntu / Debian puedes simplemente apt install jq.
Pablo A
Lo pregunté hace muchas luna y aprendí a amar jq.
Jé Queue
63

He creado un módulo diseñado específicamente para la manipulación JSON de línea de comandos:

https://github.com/ddopson/underscore-cli

  • FLEXIBLE - LA herramienta "navaja suiza" para procesar datos JSON - se puede utilizar como una simple impresora bonita o como una línea de comandos Javascript con plena potencia
  • POTENTE : expone toda la potencia y funcionalidad de underscore.js (más underscore.string)
  • SIMPLE : simplifica la escritura de líneas simples JS similares al uso de "perl -pe"
  • EN CADENA: se pueden encadenar varias invocaciones de comandos para crear una tubería de procesamiento de datos
  • MULTIFORMATO : soporte completo para formatos de entrada / salida: impresión bonita, JSON estricto, etc. [próximamente]
  • DOCUMENTADO : excelente documentación de línea de comandos con múltiples ejemplos para cada comando

Te permite hacer cosas poderosas con mucha facilidad:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

Y tiene uno de los mejores formateadores JSON de "espacio en blanco inteligente" disponibles:

Si tiene alguna solicitud de función, comente esta publicación o agregue un problema en github. Me gustaría priorizar las funciones que necesitan los miembros de la comunidad.

Dave Dopson
fuente
¡Increíble! Pero, ¿es posible ejecutar comandos de consola en datos JSON? Por ejemplo: dado un archivo JSON con una matriz de URL, wgetcada URL.
Camilo Martin
@CamiloMartin: la forma más fácil de hacerlo es imprimir las URL, una URL por línea, y luego ejecutarla a través de xargs o paralelo GNU.
Dave Dopson
@DaveDopson ¿Puedo usar underscorepara analizar json anidados que tienen objetos y matrices anidados?
user227666
1
@ user227666 - claro. JSON admite la anidación de muchos niveles de objetos. O puede querer decir JSON que tiene una cadena que codifica más JSON. Lo que también funciona, pero requiere solo un poco de mung.
Dave Dopson
@DaveDopson ¿El subrayado admite "contiene" un "patrón", es decir. para una "clave" específica, el posible conjunto de valores (sin distinción entre mayúsculas y minúsculas)? Intenté "jq" con match, pero no funciona. También publiqué mi caso de uso completo aquí - stackoverflow.com/questions/25463196/…
ekta
13

Checkout TickTick .

Es un verdadero analizador Bash JSON.

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``
coolaj86
fuente
Tengo que amar las herramientas de nivel de capa :)
Jé Queue
12

También hay kit de herramientas de procesamiento de línea de comandos JSON si tiene node.js y npm en su pila.

Y otro comando "json" para masajear JSON en su línea de comando Unix.

Y aquí están las otras alternativas:


Relacionado: ¿ Herramienta de línea de comando para analizar la entrada JSON para Unix?

zpoley
fuente
Fácil de instalar, en Ubuntu: sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se
@ divideandconquer.se Lo sentimos, pero instalas esta herramienta usando npm con npm install json.
gitaarik
@rednaw Desafortunadamente, el paquete NPM jsonparece ser tomado por un paquete completamente diferente ahora.
Brad
8

¿Alguien mencionó Jshon o JSON.sh?

https://github.com/keenerd/jshon

canalice json hacia él, y atraviesa los objetos json e imprime la ruta al objeto actual (como una matriz JSON) y luego el objeto, sin espacios en blanco.

http://kmkeen.com/jshon/
Jshon carga el texto json de stdin, realiza acciones, luego muestra la última acción en stdout y también se hizo parte de la canalización de procesamiento de texto habitual.

hewigovens
fuente
Ejemplo de uso en OSX: brew install jshon,cat *.json | jshon
kenorb
2

Puede probar jsawk como se sugiere en esta respuesta .

Realmente podrías crear un script de Python rápido para hacer esto.

NG
fuente
1

Para Bash / Python , aquí hay un contenedor básico alrededor de Python simplejson:

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

Realmente solo maneja el estilo de datos de diccionario anidado, pero funciona para lo que necesitaba, y es útil para recorrer el json. Probablemente podría adaptarse al gusto.

De todos modos, algo de cosecha propia para aquellos que no desean obtener otra dependencia externa. Excepto por python, por supuesto.

Ex. json_parser {field1} {field2}correría print myjson['{field1}']['{field2}'], produciendo las claves o los valores asociados con {field2}, separados por espacios.

Aaron R.
fuente
0

Acabo de hacer jkid, que es un pequeño explorador json de línea de comandos que hice para explorar fácilmente grandes objetos json. Los objetos se pueden explorar "transversalmente" y existe una opción de "vista previa" para evitar el desbordamiento de la consola.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}
Arturo
fuente
¿Cómo puedo instalar jkiden mac?
user227666