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


3062

¿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"
}


77
Hice el mío hace un tiempo: github.com/exhuma/braindump/tree/master/jsonformat El código es muy simple, usando la propia jsonbiblioteca de Python , pero también agregué pigmentos para resaltar la sintaxis.
exhuma el

Tropecé con esto, pero luego encontré a Json Pretty y me gustó bastante. Typekit lo usa en sus ejemplos de API, por lo que hay algunos errores detrás de él ^^
Nick Tomlin

Si no le importa copiar y pegar, también hay algunas herramientas simples en línea como jsonprettyprint.net donde puede imprimir rápidamente su JSON sin procesar.
Javaaaa

77
Tenga cuidado : python -m json.tool no siempre produce JSON válidos. (Sugerencia: 1e1000)
pico del

Respuestas:


4462

Con Python 2.6+ solo puedes hacer:

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

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

python -m json.tool my_json.json

si el JSON es de una fuente de internet como una API, puede usar

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

Para mayor comodidad en todos estos casos, puede hacer un alias:

alias prettyjson='python -m json.tool'

Para una mayor comodidad con un poco más de mecanografía 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 Puede poner esto .bashrcy estará disponible cada vez en shell. Invocarlo como prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


73
Puede canalizar eso pygmentize -l javascriptpara obtener una salida de color de sintaxis en su línea de comando. Editar : si tiene pigmentos instalados, eso es.
Shrikant Sharat

177
Una gran respuesta, única precaución que tengo con él es que hace una especie de salida de las teclas en el que - puede que tenga que tener en cuenta.
Chris Nash

14
En myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu

40
Esto parece escapar de los caracteres Unicode a \ uXXXX, lo que podría ser una desventaja.
usuario1071136

14
He creado un alias: alias pretty='python -mjson.tool | pygmentize -l jsonpor 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.
Clint Eastwood

1023

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:

$ 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"
}

Los . es el filtro de identidad


11
También hay una --sort-keysopción, que es útil en algunos casos.
Matthew Flaschen

99
Trabajando con rizo:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Hover Ruan

19
"jq". es genial como una impresora bonita, pero viene con una advertencia: jq (hasta la versión 1.5 de jq incluida) alterará los valores de números muy grandes y muy pequeños porque analiza los valores numéricos como valores IEEE 754 de 64 bits. Para verificar si su impresora bonita favorita tiene el mismo problema, pruebe este valor: 1e1000. Tenga en cuenta que python -mjson.tool falla mal esta prueba ya que produce Infinity, que ni siquiera es JSON.
pico

1
Como nota, puede redirigir el resultado a un archivo con formato: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Chad

26
@Meekohi la alternativa es "uso innecesario de eco". Súper feliz de haber encontrado el <<<operador, exactamente lo que estaba buscando.
jchook

381

Utilizo el argumento "espacio" JSON.stringifypara imprimir JSON en JavaScript.

Ejemplos:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);

// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

Desde la línea de comandos de Unix con Node.js, especificando JSON en la línea de comandos:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

Devoluciones:

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

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:

$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json

Usando una tubería:

echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
 s=process.openStdin();\
 d=[];\
 s.on('data',function(c){\
   d.push(c);\
 });\
 s.on('end',function(){\
   console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
 });\
"

10
Para depurar objetos en Node.js, realmente debería usar sys.inspect () en lugar de JSON.stringify (). He aquí por qué: markhansen.co.nz/inspecting-with-json-stringify
Gurpartap Singh

11
Voto negativo El OP se trata de un "script de línea de comandos * nix" y esta respuesta es un contexto diferente.
danorton

49
@danorton: JS se puede usar desde la línea de comandos a través de node.js y otras soluciones similares.
calvinf

10
No necesita la consola: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"también genera el resultado en STDOUT.
Julian D.

2
Es una mierda que el guión sea diferente para un nombre de archivo vs. stdin
Lukasz Wiktor

340

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:

underscore -i data.json print

La misma cosa:

cat data.json | underscore print

Lo mismo, más explícito:

cat data.json | underscore print --outfmt pretty

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.


44
También actualicé mi ~ / .bash_profile para que tenga la siguiente línea: alias underscor = 'underscore print --outfmt pretty' ahora solo puedo hacer curl example.com/result.json | subrayado y todavía uso guión bajo para otro formato
Gal Bracha

Gracias Dave! La herramienta es buena! alias pretty-json = "underrsore pretty" y salida de rizo agradable a la vista
Maxim Ponomarev

Gran herramienta de formato, solo una nota: el reenvío de salida a un archivo (ya sea con la opción -o o con > ) solo funciona con la impresión de subrayado . subrayado bastante guarda un archivo con señales de formato de color que se insertan, como Smth: [32m, [33m, [39mjunto 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.
tiurin

Me encanta, jqpero esto funcionó muy bien para mi "JSON" que no tenía claves entre comillas dobles.
Bluu

@DaveDopson gracias por la gran herramienta !! Voy a intentar usarlo junto con jsonselect.org/#tryit ...
mycargus

173

Usualmente solo hago:

echo '{"test":1,"test2":2}' | python -mjson.tool

Y para recuperar datos seleccionados (en este caso, el valor de "prueba"):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

Si los datos JSON están en un archivo:

python -mjson.tool filename.json

Si desea hacerlo todo de una vez, vaya curla la línea de comandos utilizando un token de autenticación:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

si se supone que el json proviene directamente de una http api, esta también es una buena herramienta implementada en python: github.com/jkbr/httpie
Florian

Si tiene un nodo instalado (y no le importa la salida de estilo YAML) también hay este paquete: rafeca.com/prettyjson para que pueda terminar un rizo con | prettyjson
Iolo

3
Como se señaló anteriormente, uno de los problemas con python -mjson.tool como impresora bonita JSON es que no siempre emite JSON. Por ejemplo, 1e1000 se convierte en Infinito (ya sea usando python 2.xo 3.x). 'jq.' siempre produce JSON, pero no garantiza que se conserven exactamente valores muy grandes (o valores muy pequeños).
pico

88

Gracias a los útiles consejos de JF Sebastian, aquí hay un script ligeramente mejorado que se me ocurrió:

#!/usr/bin/python

"""
Convert JSON data to human-readable form.

Usage:
  prettyJSON.py inputFile [outputFile]
"""

import sys
import simplejson as json


def main(args):
    try:
        if args[1] == '-':
            inputFile = sys.stdin
        else:
            inputFile = open(args[1])
        input = json.load(inputFile)
        inputFile.close()
    except IndexError:
        usage()
        return False
    if len(args) < 3:
        print json.dumps(input, sort_keys = False, indent = 4)
    else:
        outputFile = open(args[2], "w")
        json.dump(input, outputFile, sort_keys = False, indent = 4)
        outputFile.close()
    return True


def usage():
    print __doc__


if __name__ == "__main__":
    sys.exit(not main(sys.argv))

3
Cuando los valores se cargan en el diccionario, el orden se pierde: los dictobjetos normales no tienen un orden definido. Intenta json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)y encontrarás que se intercambian de todos modos. Para arreglarlo, importa OrderedDicty loadpasa object_pairs_hook=OrderedDict.
icktoofay

Puede cambiar la secuencia de comandos para leer de la entrada estándar con esto: inputFile = sys.stdin. Esto le permite canalizar cosas al guión de esta manera:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson

1
Y para evitar la clasificación con @ de icktoofay comentario, OrderedDict importación como esto: from collections import OrderedDict.
Hugo

2
Gracias @icktoofay. Esto me permitió crear la siguiente función vim: 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/issue16333
blindsnowmobile

Gran fragmento! Lo he usado en su sort_keys = Truelugar, porque quiero usar esto para comparar archivos json y funciona de maravilla.
JL Peyret

81

Si usa npm y Node.js, puede hacerlo npm install -g jsony luego canalizar el comando json. Haz json -hpara obtener todas las opciones. También puede extraer campos específicos y colorear la salida con -i.

curl -s http://search.twitter.com/search.json?q=node.js | json

79

No es demasiado simple con una forma nativa con las herramientas jq .

Por ejemplo:

cat xxx | jq .

77
ADVERTENCIA: jq codifica los números como flotantes IEEE 754 de 64 bits y, por lo tanto, es probable que su representación cambie. Es probable que se pierda la precisión de números muy pequeños y muy grandes. Para verificar si su impresora bonita favorita tiene el mismo problema, pruebe este valor: 1e1000.
pico

55
o simplemente jq . file.json:; pero también cat file.json | jq(sin el filtro .) también funciona. (en ubuntu / linux; ymmv en todas las plataformas)
michael

73

Con Perl, use el módulo CPAN JSON::XS. Instala una herramienta de línea de comando json_xs.

Validar:

json_xs -t null < myfile.json

Prettifique el archivo JSON src.jsonpara pretty.json:

< src.json json_xs > pretty.json

Si no tienes json_xs, inténtalo json_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).


99
¡Parece venir de serie con Cygwin!
Janus Troelsen

13
json_pp puede usarse de la misma manera y probablemente se instale fácilmente en su sistema (en Debian está en el paquete 'perl').
MichielB

8
Para su información, en mi sistema Mac OS X 10.9, json_pp está disponible automáticamente.
Gregg Williams

-t nullme dio nulo: no es un toformat válido ... pero dejarlo funcionó espléndidamente. Gracias.
Lucas

pp es para perl puro, no es bonito imprimir aquí :) Ya que json_xs y json_pp pueden hacer más que solo imprimir bonito y también con -json_opt hacer otras cosas en lugar de imprimir bonito. Aunque la impresión bonita es el comportamiento predeterminado.
Kjetil S.

70

En * nix, leer desde stdin y escribir en stdout funciona mejor:

#!/usr/bin/env python
"""
Convert JSON data to human-readable form.

(Reads from stdin and writes to stdout)
"""

import sys
try:
    import simplejson as json
except:
    import json

print json.dumps(json.loads(sys.stdin.read()), indent=4)
sys.exit(0)

Ponga esto en un archivo (llamé al mío "prettyJSON" después de la respuesta de AnC ) en su RUTA y chmod +xlisto, y listo.


De hecho, usar stdin / stdout es mucho más flexible y simple. Gracias por mencionarlo.
AnC

3
Para los programas que esperan un archivo con nombre, use / dev / stdin, lo mismo para out y err.
dvogel

44
FYI fileinput.input()lee de stdin si no hay archivos dados en una línea de comandos. Ejemplo
jfs

fileinput.input () no puede tratar bien con archivos sin nueva línea al final, la última vez que lo verifiqué.
Zachary Vance

pregunta en script de shell, no en Python, otro lenguaje. Con JQ puedes hacerlo perfectamente.
Bui Anh Tuan

65

JSON Ruby Gem se incluye con un script de shell para embellecer JSON:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

Descarga del script: gist.github.com/3738968


66
Tenga en cuenta que esta solución decodifica las secuencias de escape unicode "\ uxxxx", a diferencia de la de Python con json.tool. Sin embargo, también parece tener limitaciones de profundidad de anidación ( nesting of 20 is too deep (JSON::NestingError)).
a3nm

2
en Ubuntu puedes hacer: en sudo apt-get install ruby-json-purelugar degem install
Janus Troelsen

1
`` `eric-mbp: ~ ericstob $ sudo gem install json Contraseña: Obteniendo: json-1.7.3.gem (100%) Construyendo extensiones nativas. Esto podría tomar un tiempo ... Instalado con éxito json-1.7.3 1 gema instalada Instalando documentación ri para json-1.7.3 ... Instalando documentación RDoc para json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: comando no encontrado
Eric Hartford

tal vez podrías publicar el contenido de tu prettify_json.rb?
Andrew

Puede descargar el guión, moverlo a la ~/bincarpeta (asegúrese de que está en su PATH) de cambio de nombre prettify_json.rba ppjy correr chmod +x ppj. Ahora puedes hacer algo comocurl www.jsonsring.com/something.json | ppj
Uri

58

ACTUALIZACIÓN Estoy usando jqahora 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:

Respuestas de servicio web bastante impresas así:

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp

y embellece los archivos que se ejecutan en tu disco:

jsonpp data/long_malformed.json

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.


1
Intenté jsonpp (utilizado en el pasado con éxito) contra un archivo enorme (> 60 MB). Lo detuve después de 5 minutos. Lo conecté python -mjson.tool(desde otra respuesta aquí) y tardó 10-20 segundos ...
volker

60MB de JSON? ¡Guauu! Normalmente no trato con archivos tan grandes pero útiles para saber. Gracias.
jordelver

En mi cuadro de ubuntu tengo un 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 al jsonppmencionado aquí
davidpricedev

56

Así es como lo hago:

curl yourUri | json_pp

Acorta el código y hace el trabajo.


3
Servidor Ubuntu: si tiene máquinas de producción con instalaciones muy restringidas, esta podría ser la mejor opción, ya que se instala de forma predeterminada con un nombre específico. Python a menudo se instala de diferentes maneras (por ejemplo, python3, python o no) dependiendo de la versión.
jonathanjo

55

un script bash simple para una bonita impresión json

json_pretty.sh

#/bin/bash

grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'

Ejemplo:

cat file.json | json_pretty.sh

1
Gracias por la respuesta. Acabo de escribir este script hoy para uso personal y funcionó bien en mis casos. Hice arreglos, ahora es más pequeño y sin este problema. No hay un objetivo para admitir el formato completo, pero puedo hacer otras correcciones si es necesario.
Evgeny Karpov

2
Esa es la única respuesta que encontré. Tengo un Linux incrustado: sin rubby, sin javascript, sin acceso a internet para descargar módulos de python ... Tengo un awk ligeramente diferente que no admite %*cnotación, así que cambié printfa c=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 /[]}]/.
Zaboj Campula

2
Esto debería ser aceptado, ya que es completamente nativo y no requiere software de terceros ...
Blag

1
@EvgenyKarpov buena captura, no hay necesidad de una reversión completa, solo la grepque fue borrada por error;)
Blag

1
Gracias amigo, quería una forma rápida de formatear un json de una sola línea de 8 MB, en simple bash simple.
Ahmed M

53

Tratar pjson. Tiene colores!

echo '{"json": "obj"} |  pjson

Instalarlo con pip:

⚡ pip install pjson

Y luego canalice cualquier contenido JSON a pjson.


Requiere python-pip (sudo apt-get install python-pip) y luego (sudo pip install pjson) ¡La gran ventaja son los colores!
Kristjan Adojaan

1
La desventaja es que no es posible grep resultados de color.
Kristjan Adojaan

51
$ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
>                  sort_keys=True, indent=4))'
{
    "bar": "ipsum",
    "foo": "lorem"
}

NOTA: No es la forma de hacerlo.

Lo mismo en Perl:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Nota 2: si corres

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

la palabra agradablemente legible se codifica

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

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

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4, ensure_ascii=False)'

y obtendrás:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}

en realidad hago lo mismo pero con javascript en sí :)
Robert Gould

2
En la versión del módulo JSON que tengo, to_jsonno parece aceptar opciones. Pero esto funciona:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd

El ejemplo de Python podría simplificarse. Es mucho más fácil canalizar la salida JSON directamente python -m json.tool.
Dan Loewenherz

@Dan: sí. Y hay varias respuestas que muestran json.toolejemplos de código. 1. esta versión le permite cambiar algunos parámetros, por ejemplo, indent2. En el momento de la publicación (2008), Python 2.4 todavía se usaba y no era compatible-mjson.tool
jfs el

40

Yo uso jshon para hacer exactamente lo que estás describiendo. Solo corre:

echo $COMPACTED_JSON_TEXT | jshon

También puede pasar argumentos para transformar los datos JSON.


Gracias, jshon es mucho más rápido que usar python o ruby ​​para la misma tarea
Alexander

2
@Alexander - ¿Qué tan rápido necesitas una bonita impresora? Estoy en OSx Lion que viene con Python preinstalado. Con python -mjson.tool puedo imprimir bastante un archivo json de 96 KB en 0.1s - la salida json de earthporn a la que jshon enlaza es de aproximadamente 24 KB y puedo imprimir eso en 0.08s. ¿Cuánto más rápido es jshon para ti?
joensson

1
Estoy trabajando con archivos de datos JSON comprimidos de 1 + GB (quién sabe qué tan grande sin comprimir), por lo que agradezco mucho la sugerencia de que jshon es más rápido.
Ryan Ballantyne

38

O con Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

Eso me da un error. ¿Necesitas algún paquete de ruby ​​json instalado?
mjs

3
Sí, necesita JSON Ruby Gem: sudo gem install json
darscan

@MatSchaffer Tenga en cuenta que esto no funciona si está utilizando JSON para serializar objetos con to_jsonmétodos personalizados ; Kernel#jjsolo imprime bonitas matrices y hashes de la misma (o números / cadenas / booleanos).
Phrogz

En Windows, intente esto: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Ross Attrill

36

Echa un vistazo a Jazor . Es un analizador JSON de línea de comando simple escrito en Ruby.

gem install jazor
jazor --help

44
¿Soy solo yo o esta es la única sugerencia que realmente responde a la pregunta del OP? Vine aquí buscando un comando simple en el que pudiera canalizar la salida curly este es el único que lo hizo por mí.
Leo Cassarani

2
Me gusta que tiene la opción de colorear la salida. Lo hace más fácil de leer.
Andrew

ooh También me gusta la opción de pasar una url ya que estoy usando esto para ver la salida de mi API REST
Andrew

35

Puede usar este comando simple para lograr el resultado:

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

La mejor respuesta en mi opinión. Pequeño y fácil de recordar y no requiere la instalación de herramientas no estándar.
Eugene C

python -m json.tool no parece preservar el orden del objeto JSON.
pushNpop


28

Simplemente canalice la salida a jq ..

Ejemplo:

twurl -H ads-api.twitter.com '.......' | jq .

Buena respuesta @Ackshaey Singh y uno puede redirigir el mismo a un archivo también fácilmente. por ejemplocat <file_name.txt> | jq . > <output_name.txt>
Pramit

99
brew install jqsi estás en mac os.
Distwo

1
Desafortunadamente, el uso 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.
pico

2
@Pramit cat file |es invariablemente un desperdicio de un proceso; solo hazlo jq . <file_name.txt >output_name.txt(con literales <y >caracteres).
Mark Reed

25

Con Perl, si instala JSON :: PP desde CPAN obtendrá el comando json_pp . Robando el ejemplo de B Bycroft obtienes:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Vale la pena mencionar que json_ppviene preinstalado con Ubuntu 12.04 (al menos) y Debian en/usr/bin/json_pp


24

Pygmentize

Combino json.tool de Python con pygmentize:

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g

Hay algunas alternativas a pygmentize que se enumeran en mi esta respuesta .

Aquí hay una demostración en vivo:

Manifestación


55
A veces hay que usar pygmentize -l jsonpara obtener colorización.
JP

Instalar con el paquete apt python-pygments, es decirapt-get install python-pygments
enero

19

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í:

sudo apt-get install libjson-xs-perl

Obviamente también está disponible en CPAN .

Para usarlo para formatear JSON obtenido de una URL, puede usar curl o wget de esta manera:

$ curl -s http://page.that.serves.json.com/json/ | json_xs

o esto:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs

y para formatear JSON contenido en un archivo puede hacer esto:

$ json_xs < file-full-of.json

Para formatear como YAML , que algunas personas consideran más legible para los humanos que JSON:

$ json_xs -t yaml < file-full-of.json

19

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)

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

La gran ventaja de jq es que puede hacer MUCHO más si desea analizar y procesar el json.


json_pp estaba en mi Mac, pero no jq. ¡Gracias!
David H


¡Gracias! Nunca había oído hablar de jq antes.
David H

17

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.

jj -p # for reading from STDIN

o

jj -p -i input.json

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.



16

bates un catclon con resaltado de sintaxis:

Ejemplo:

echo '{"bignum":1e1000}' | bat -p -l json

-psaldrá sin encabezados y -lespecificará 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?


12

Instala yajl-tools con el siguiente comando:

sudo apt-get install yajl-tools

entonces,

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat


Increíble. No requiere otro idioma / intérprete y está en el repositorio del paquete, ¡no es necesario prepararlo!
Joseph Lust
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.