¿Cómo puedo imprimir JSON en un script de shell?

Resuelto asked hace 16 años • 0 respuestas

¿Existe un script de shell (Unix) para formatear JSON en formato legible por humanos?

Básicamente, quiero que transforme lo siguiente:

{ "foo": "lorem", "bar": "ipsum" }

... en algo como esto:

{
    "foo": "lorem",
    "bar": "ipsum"
}
 avatar Dec 09 '08 15:12
Aceptado

Con Python 2.6+ o 3 puedes usar el módulo json.tool :

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool

o, si el JSON está en un archivo, puedes hacer:

python -m json.tool my_json.json

Si el JSON proviene de una fuente de Internet, como una API, puede utilizar

curl http://my_url/ | python -m json.tool

Para mayor comodidad, en todos estos casos puedes crear un alias:

alias prettyjson='python -m json.tool'

Para mayor comodidad con un poco más de escritura para tenerlo listo:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}

para todos los casos anteriores. Puedes poner esto .bashrcy estará disponible siempre en Shell. Invocarlo como prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

Tenga en cuenta que, como @pnd señaló en los comentarios a continuación, en Python 3.5+ el objeto JSON ya no está ordenado de forma predeterminada. Para ordenar, agregue la --sort-keysbandera al final. Es decir ... | python -m json.tool --sort-keys.

Otra opción útil podría ser --no-ensure-asciila que desactiva el escape de caracteres que no sean ASCII (nuevo en la versión 3.9).

Cristian Ciupitu avatar Dec 17 '2009 09:12 Cristian Ciupitu

Puedes usar:jq

¡Es muy sencillo de usar y funciona muy bien! Puede manejar estructuras JSON muy grandes, incluidas secuencias. Puedes encontrar sus tutoriales aquí .

Ejemplos de uso:

$ jq --color-output . file1.json file1.json | less -R

$ command_with_json_output | jq .

$ jq # stdin/"interactive" mode, just enter some JSON

$ jq <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

O utilizar jqcon filtro de identidad:

$ jq '.foo' <<< '{ "foo": "lorem", "bar": "ipsum" }'
"lorem"
Vita Pluvia avatar Mar 05 '2013 18:03 Vita Pluvia