¿Cómo puedo imprimir JSON en un script de shell?
¿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"
}
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 .bashrc
y 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-keys
bandera al final. Es decir ... | python -m json.tool --sort-keys
.
Otra opción útil podría ser --no-ensure-ascii
la que desactiva el escape de caracteres que no sean ASCII (nuevo en la versión 3.9).
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 jq
con filtro de identidad:
$ jq '.foo' <<< '{ "foo": "lorem", "bar": "ipsum" }'
"lorem"