¿Existe un script de shell (Unix) para formatear JSON en forma legible para humanos?
Básicamente, quiero que transforme lo siguiente:
{ "foo": "lorem", "bar": "ipsum" }
... en algo como esto:
{
"foo": "lorem",
"bar": "ipsum"
}
¿Existe un script de shell (Unix) para formatear JSON en forma legible para humanos?
Básicamente, quiero que transforme lo siguiente:
{ "foo": "lorem", "bar": "ipsum" }
... en algo como esto:
{
"foo": "lorem",
"bar": "ipsum"
}
json
biblioteca de Python , pero también agregué pigmentos para resaltar la sintaxis.Respuestas:
Con Python 2.6+ solo puedes hacer:
o, si el JSON está en un archivo, puede hacer:
si el JSON es de una fuente de internet como una API, puede usar
Para mayor comodidad en todos estos casos, puede hacer un alias:
Para una mayor comodidad con un poco más de mecanografía para tenerlo listo:
para todos los casos anteriores Puede poner esto
.bashrc
y estará disponible cada vez en shell. Invocarlo comoprettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.fuente
pygmentize -l javascript
para obtener una salida de color de sintaxis en su línea de comando. Editar : si tiene pigmentos instalados, eso es.alias pretty='python -mjson.tool | pygmentize -l json
por lo que sólo puede ejecutar:command params | pretty
. Espero que esto ayude. PD: Si alguien logra extender esto a a) eliminar el curl-output que veo cada vez y / o b) NO ordenar las teclas json; por favor hágamelo saber, estaré muy agradecido.Puedes usar:
jq
¡Es muy simple de usar y funciona muy bien! Puede manejar estructuras JSON muy grandes, incluidas las secuencias. Puedes encontrar sus tutoriales aquí .
Ejemplos de uso:
Los . es el filtro de identidad
fuente
--sort-keys
opción, que es útil en algunos casos.curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
.<<<
operador, exactamente lo que estaba buscando.Utilizo el argumento "espacio"
JSON.stringify
para imprimir JSON en JavaScript.Ejemplos:
Desde la línea de comandos de Unix con Node.js, especificando JSON en la línea de comandos:
Devoluciones:
Desde la línea de comandos de Unix con Node.js, especificando un nombre de archivo que contiene JSON y usando una sangría de cuatro espacios:
Usando una tubería:
fuente
node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
también genera el resultado en STDOUT.Escribí una herramienta que tiene uno de los mejores formateadores de "espacios en blanco inteligentes" disponibles. Produce resultados más legibles y menos detallados que la mayoría de las otras opciones aquí.
subrayado-cli
Así es como se ve el "espacio en blanco inteligente":
Puede que esté un poco sesgado, pero es una herramienta increíble para imprimir y manipular datos JSON desde la línea de comandos. Es muy fácil de usar y tiene una amplia ayuda / documentación de línea de comandos. Es una navaja suiza que uso para 1001 pequeñas tareas diferentes que serían sorprendentemente molestas de hacer de otra manera.
Último caso de uso: Chrome, Consola de desarrollo, pestaña Red, exportar todo como archivo HAR, "cat site.har | subrayado seleccione '.url' --outfmt text | grep mydomain"; ahora tengo una lista ordenada cronológicamente de todas las recuperaciones de URL realizadas durante la carga del sitio de mi empresa.
La impresión bonita es fácil:
La misma cosa:
Lo mismo, más explícito:
Esta herramienta es mi proyecto de pasión actual, por lo que si tiene alguna solicitud de función, es muy probable que la aborde.
fuente
[32m
,[33m
,[39m
junto con algunos no imprimible antes de cada uno de ellos, lo que hace JSON no es válido. Sin embargo, la impresión de subrayado por sí sola no agrega nada a un archivo y hace su trabajo de formateo perfectamente.jq
pero esto funcionó muy bien para mi "JSON" que no tenía claves entre comillas dobles.Usualmente solo hago:
Y para recuperar datos seleccionados (en este caso, el valor de "prueba"):
Si los datos JSON están en un archivo:
Si desea hacerlo todo de una vez, vaya
curl
a la línea de comandos utilizando un token de autenticación:fuente
| prettyjson
Gracias a los útiles consejos de JF Sebastian, aquí hay un script ligeramente mejorado que se me ocurrió:
fuente
dict
objetos normales no tienen un orden definido. Intentajson.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)
y encontrarás que se intercambian de todos modos. Para arreglarlo, importaOrderedDict
yload
pasaobject_pairs_hook=OrderedDict
.inputFile = sys.stdin
. Esto le permite canalizar cosas al guión de esta manera:curl http://somewhere.com/foo.json | pp_json.py
from collections import OrderedDict
.com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))"
tenga en cuenta que los separadores deben establecerse como (',', ':') para evitar agregar espacios en blanco al final: bugs.python.org/issue16333sort_keys = True
lugar, porque quiero usar esto para comparar archivos json y funciona de maravilla.Si usa npm y Node.js, puede hacerlo
npm install -g json
y luego canalizar el comandojson
. Hazjson -h
para obtener todas las opciones. También puede extraer campos específicos y colorear la salida con-i
.fuente
No es demasiado simple con una forma nativa con las herramientas jq .
Por ejemplo:
fuente
jq . file.json
:; pero tambiéncat file.json | jq
(sin el filtro.
) también funciona. (en ubuntu / linux; ymmv en todas las plataformas)Con Perl, use el módulo CPAN
JSON::XS
. Instala una herramienta de línea de comandojson_xs
.Validar:
Prettifique el archivo JSON
src.json
parapretty.json
:Si no tienes
json_xs
, inténtalojson_pp
. "pp" es para "perl puro": la herramienta se implementa solo en Perl, sin un enlace a una biblioteca C externa (que es lo que significa XS, el "Sistema de extensión" de Perl).fuente
-t null
me dio nulo: no es un toformat válido ... pero dejarlo funcionó espléndidamente. Gracias.En * nix, leer desde stdin y escribir en stdout funciona mejor:
Ponga esto en un archivo (llamé al mío "prettyJSON" después de la respuesta de AnC ) en su RUTA y
chmod +x
listo, y listo.fuente
fileinput.input()
lee de stdin si no hay archivos dados en una línea de comandos. EjemploJSON Ruby Gem se incluye con un script de shell para embellecer JSON:
Descarga del script: gist.github.com/3738968
fuente
json.tool
. Sin embargo, también parece tener limitaciones de profundidad de anidación (nesting of 20 is too deep (JSON::NestingError)
).sudo apt-get install ruby-json-pure
lugar degem install
prettify_json.rb
?~/bin
carpeta (asegúrese de que está en su PATH) de cambio de nombreprettify_json.rb
appj
y correrchmod +x ppj
. Ahora puedes hacer algo comocurl www.jsonsring.com/something.json | ppj
ACTUALIZACIÓN Estoy usando
jq
ahora como se sugiere en otra respuesta. Es extremadamente poderoso para filtrar JSON, pero, en su forma más básica, también es una forma increíble de imprimir JSON para verlo.jsonpp es una bonita impresora JSON de línea de comandos muy bonita.
Desde el archivo Léame:
Si estás en Mac OS X, puedes hacerlo
brew install jsonpp
. Si no, simplemente puede copiar el binario en algún lugar de su$PATH
.fuente
python -mjson.tool
(desde otra respuesta aquí) y tardó 10-20 segundos ...json_pp
, que formatea muy bien json, aunque a pesar de la similitud en la denominación, creo que este es un proyecto completamente diferente aljsonpp
mencionado aquíAsí es como lo hago:
Acorta el código y hace el trabajo.
fuente
un script bash simple para una bonita impresión json
json_pretty.sh
Ejemplo:
fuente
%*c
notación, así que cambiéprintf
ac=0; while (c++<offset) printf " "; printf $0;
. Y mi awk tiene diferentes expresiones regulares de escape y la barra invertida no funciona[]
. Cambié las expresiones regulares a/^[[{]/
y/[]}]/
.grep
que fue borrada por error;)Tratar
pjson
. Tiene colores!Instalarlo con
pip
:⚡ pip install pjson
Y luego canalice cualquier contenido JSON a
pjson
.fuente
NOTA: No es la forma de hacerlo.
Lo mismo en Perl:
Nota 2: si corres
la palabra agradablemente legible se codifica
Si el resto de su canalización manejará con gracia Unicode y desea que su JSON también sea amigable para los humanos, simplemente use
ensure_ascii=False
y obtendrás:
fuente
to_json
no parece aceptar opciones. Pero esto funciona:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
python -m json.tool
.json.tool
ejemplos de código. 1. esta versión le permite cambiar algunos parámetros, por ejemplo,indent
2. En el momento de la publicación (2008), Python 2.4 todavía se usaba y no era compatible-mjson.tool
Yo uso jshon para hacer exactamente lo que estás describiendo. Solo corre:
También puede pasar argumentos para transformar los datos JSON.
fuente
O con Ruby:
fuente
to_json
métodos personalizados ;Kernel#jj
solo imprime bonitas matrices y hashes de la misma (o números / cadenas / booleanos).echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Echa un vistazo a Jazor . Es un analizador JSON de línea de comando simple escrito en Ruby.
fuente
curl
y este es el único que lo hizo por mí.Puede usar este comando simple para lograr el resultado:
fuente
JSONLint tiene una implementación de código abierto en GitHub que puede usarse en la línea de comando o incluirse en un proyecto Node.js.
y entonces
o
fuente
Simplemente canalice la salida a
jq .
.Ejemplo:
fuente
cat <file_name.txt> | jq . > <output_name.txt>
brew install jq
si estás en mac os.jq .
para la impresión bonita tiene un inconveniente potencial : todas las versiones existentes de jq insisten en tratar los números JSON como números IEEE, por lo que la precisión se pierde fácilmente, por ejemplo, para enteros muy grandes.cat file |
es invariablemente un desperdicio de un proceso; solo hazlojq . <file_name.txt >output_name.txt
(con literales<
y>
caracteres).Con Perl, si instala JSON :: PP desde CPAN obtendrá el comando json_pp . Robando el ejemplo de B Bycroft obtienes:
Vale la pena mencionar que
json_pp
viene preinstalado con Ubuntu 12.04 (al menos) y Debian en/usr/bin/json_pp
fuente
Pygmentize
Combino json.tool de Python con pygmentize:
Hay algunas alternativas a pygmentize que se enumeran en mi esta respuesta .
Aquí hay una demostración en vivo:
fuente
pygmentize -l json
para obtener colorización.python-pygments
, es decirapt-get install python-pygments
Recomiendo usar la utilidad de línea de comandos json_xs que se incluye en el módulo perl JSON :: XS. JSON :: XS es un módulo Perl para serializar / deserializar JSON, en una máquina Debian o Ubuntu puede instalarlo así:
Obviamente también está disponible en CPAN .
Para usarlo para formatear JSON obtenido de una URL, puede usar curl o wget de esta manera:
o esto:
y para formatear JSON contenido en un archivo puede hacer esto:
Para formatear como YAML , que algunas personas consideran más legible para los humanos que JSON:
fuente
Simplemente puede usar herramientas estándar como jq o json_pp.
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
o
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
ambos embellecerán la salida como la siguiente (jq aún más colorida)
La gran ventaja de jq es que puede hacer MUCHO más si desea analizar y procesar el json.
fuente
jj es súper rápido, puede manejar documentos JSON descomunales de forma económica, no se mete con números JSON válidos y es fácil de usar, p. ej.
o
Es (2018) todavía bastante nuevo, por lo que tal vez no manejará JSON no válidos de la manera que espera, pero es fácil de instalar en las principales plataformas.
fuente
brew install jq
command + | jq
curl localhost:5000/blocks | jq
)fuente
bat
es uncat
clon con resaltado de sintaxis:Ejemplo:
-p
saldrá sin encabezados y-l
especificará explícitamente el idioma.Tiene colores y formatos para JSON y no tiene los problemas señalados en este comentario: ¿Cómo puedo imprimir JSON en un script de shell?
fuente
Instala yajl-tools con el siguiente comando:
sudo apt-get install yajl-tools
entonces,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
fuente