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

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

Básicamente, quiero que transforme lo siguiente:

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

... en algo como esto:

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

preguntado el 09 de diciembre de 08 a las 06:12

Rodé el mío hace un rato: github.com/exhuma/braindump/tree/master/jsonformat El código es muy simple, usando el propio Python json biblioteca, pero también agregué pigmentos para resaltar la sintaxis. -

Tropecé con esto pero luego encontré Json bastante y me gusta bastante. Typekit lo usa en sus ejemplos de API, por lo que hay algo de klout detrás ^^ -

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

Ten cuidado python -m json.herramienta no siempre produce JSON válido. (Pista: 1e1000) -

30 Respuestas

Con Python 2.6+ puede 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

Por conveniencia en todos estos casos, puede crear un alias:

alias prettyjson='python -m json.tool'

Para una mayor comodidad con un poco más de escritura para prepararlo:

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 en .bashrc y estará disponible todo el tiempo 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 el --sort-keys bandera hasta el final. Es decir ... | python -m json.tool --sort-keys.

Respondido el 18 de diciembre de 20 a las 15:12

Podrías canalizar eso a pygmentize -l javascript para obtener una salida de color de sintaxis en su línea de comando. Editar: Si tiene pigmentos instalados. - Shrikant Sharat

Una gran respuesta, la única precaución que tengo es Ordene las claves en la salida, lo que quizás deba tener en cuenta. - Chris Nash

En myy .vimrc "nnoremap :%! python -m json.tool : w "- imwilsonxu

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

Creé un alias: alias pretty='python -mjson.tool | pygmentize -l json para que pueda ejecutar: command params | pretty. Espero que esto ayude. PD: Si alguien logra extender esto para a) eliminar la salida curl que veo cada vez y / ob) NO ordenar las claves json; por favor avíseme, estaré muy agradecido. - Clint Eastwood

Puedes usar: jq

¡Es muy simple 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 usar jq con filtro de identidad:

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

Respondido el 23 de junio de 20 a las 15:06

También hay una --sort-keys opción, que es útil en algunos casos. - Mateo Flaschen

Trabajando con curl: curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.' - Pase el ratón sobre Ruan

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

@Meekohi la alternativa es "uso innecesario de echo". Super feliz de haber encontrado el <<< operador - exactamente lo que estaba buscando. - jchook

jq es el mejor porque imprime en colores! - phil294

Yo uso el argumento "espacio" de JSON.stringify para 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 pipa:

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));\
 });\
"

Respondido 09 Abr '19, 13:04

Para depurar objetos en Node.js, realmente debería usar sys.inspect () en lugar de JSON.stringify (). Este es el por qué: markhansen.co.nz/inspección-con-json-stringify - Gurpartap Singh

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

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

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

Apesta que el script sea diferente para un nombre de archivo frente a stdin - Lukasz Wiktor

Escribí una herramienta que tiene uno de los mejores formateadores de "espacios en blanco inteligentes" disponibles. Produce una salida más legible y menos detallada 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 en la línea de comandos. Es una navaja suiza que utilizo 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 seleccionar '.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 actual que me apasiona, por lo que si tiene alguna solicitud de funciones, es muy probable que la aborde.

respondido 15 nov., 17:23

También actualicé mi ~ / .bash_profile para tener la siguiente línea: alias underscor = 'underscore print --outfmt pretty' ahora solo puedo hacer curl ejemplo.com/resultado.json | subrayado y seguir utilizando subrayado para otros formatos: gal bracha

¡Gracias Dave! ¡La herramienta es buena! alias pretty-json = "underrsore pretty" y salida de curl agradable a la vista - maximo ponomarev

Gran herramienta de formato, solo una nota: reenviar la salida a un archivo (ya sea con -o opción o con > ) funciona solo con impresión de subrayado. subrayado bonito guarda un archivo con letreros de formato de color que se insertan, algo como: [32m, [33m, [39m junto con algunos no imprimibles antes de cada uno de ellos, lo que hace que JSON no sea válido. Sin emabargo, impresión de subrayado por sí solo no agrega nada a un archivo y hace su trabajo de formateo a la perfección. - tiurín

Amo las jq pero esto funcionó muy bien para mi "JSON" que no tenía claves entre comillas dobles. - Azul

@DaveDopson gracias por la gran herramienta !! Voy a intentar usarlo junto jsonselect.org/#pruébalo ... - micargo

Por lo general, 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 quieres hacerlo todo de una vez con curl en la línea de comando usando un token de autenticación:

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

respondido 15 nov., 17:23

si se supone que json proviene directamente de una api http, 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 está este paquete: rafeca.com/prettyjson para que puedas terminar un rizo con | prettyjson - yolo

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

Gracias a los útiles consejos de JF Sebastian, he aquí un guión 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))

Respondido 21 Jul 15, 17:07

Cuando los valores se cargan en el diccionario, se pierde el orden: normal dict los objetos no tienen un orden definido. Intentar json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False) y encontrará que están intercambiados de todos modos. Para solucionarlo, importa OrderedDict y load paso object_pairs_hook=OrderedDict. - icktoofay

Puede cambiar el script para leer desde la entrada estándar con esto: inputFile = sys.stdin. Esto le permite canalizar cosas al script de esta manera: curl http://somewhere.com/foo.json | pp_json.py - gabe johnson

Y para evitar ordenar con el comentario de @ icktoofay, importe OrderedDict así: from collections import OrderedDict. - Hugo

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 que se agreguen espacios en blanco finales: bugs.python.org/issue16333 - moto de nieve ciega

¡Gran fragmento! he usado sort_keys = True en cambio, porque quiero usar esto para comparar archivos json y funciona como un encanto. - JL Peyret

Si usa npm y Node.js, puede hacer npm install -g json y luego canalice el comando a través de json. Hacer json -h para 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

respondido 15 nov., 17:23

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

Por ejemplo:

cat xxx | jq .

respondido 16 nov., 17:00

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

o simplemente: jq . file.json ; pero también cat file.json | jq (sin el filtro .) también funciona. (en ubuntu / linux; ymmv a través de plataformas) - michael

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

Validar:

json_xs -t null < myfile.json

Embellece el archivo JSON src.json a pretty.json:

< src.json json_xs > pretty.json

Si no tienes json_xs, Trate de 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 XS significa, "Sistema de extensión" de Perl).

Respondido 03 Feb 17, 18:02

¡Parece ser estándar con Cygwin! - Janus Troelsen

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

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

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

pp es para perl puro, aquí no se imprime bonito :) Dado 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.

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)

Pon esto en un archivo (llamé al mío "prettyJSON" después de Congreso Nacional Africanorespuesta) en su RUTA y chmod +x y listo.

Respondido 02 ago 17, 09:08

De hecho, usar stdin / stdout es mucho más flexible y simple. Gracias por mencionarlo. - Congreso Nacional Africano

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

Para su información 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 verifiqué. - Zachary Vance

pregunta en un script de shell, no en Python en otro lenguaje. Con JQ puedes hacerlo a la perfección. - Bui Anh Tuan

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

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

Descarga de script: gist.github.com/3738968

Respondido el 17 de Septiembre de 12 a las 20:09

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

en Ubuntu puedes hacer: sudo apt-get install ruby-json-pure en lugar de gem install - Janus Troelsen

`` `eric-mbp: ~ ericstob $ sudo gem install json Contraseña: Obteniendo: json-1.7.3.gem (100%) Construyendo extensiones nativas. Esto podría llevar un tiempo ... Se instaló correctamente 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? - Andrés

Puede descargar el script, moverlo a su ~/bin carpeta (asegúrese de que esté en su RUTA) cambie el nombre prettify_json.rb a ppj y correr chmod +x ppj. Ahora puedes hacer algo como curl www.jsonsring.com/something.json | ppj - Uri

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

Respondido 28 Abr '19, 12:04

Gracias por la respuesta. Hoy escribí este script 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 completamente el formato, pero puedo hacer otras correcciones si es necesario. - Yevgeny Karpov

Esa es la única respuesta de trabajo 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 es compatible %*c notación, así que cambié la printf a c=0; while (c++<offset) printf " "; printf $0;. Y mi awk tiene diferentes expresiones regulares que escapan y la barra invertida no funciona en []. Cambié las expresiones regulares a /^[[{]/ y /[]}]/. - Zaboj Campula

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

@EvgenyKarpov buena captura, no es necesario un retroceso completo, solo el grep que fue borrado por error;) - Blag

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

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 su visualización.

jsonpp es una bonita impresora JSON de línea de comandos muy agradable.

Del README:

Respuestas de servicio web bastante impresas como esta:

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á en Mac OS X, puede brew install jsonpp. Si no es así, simplemente puede copiar el binario en algún lugar de su $PATH.

respondido 15 nov., 17:23

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

60 MB de JSON? ¡Guau! Normalmente no trato con archivos tan grandes pero útiles de conocer. Gracias. - jordelver

En mi caja de ubuntu tengo un json_pp - que formatea json muy bien, aunque a pesar de la similitud en los nombres, creo que este es un proyecto completamente diferente del jsonpp mencionado aquí - davidpricedev

Así es como lo hago:

curl yourUri | json_pp

Acorta el código y hace el trabajo.

respondido 15 nov., 17:23

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 nada) dependiendo de la versión. - Jonathanjo

$ 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 ejecuta

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 de fácil lectura se codifica en \ u

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

Si el resto de su canalización manejará correctamente Unicode y desea que su JSON también sea amigable para los humanos, simplemente utilizado 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á:

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

Respondido el 19 de Septiembre de 16 a las 00:09

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

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

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

@Dan: sí. Y hay varias respuestas que muestran 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) todavía se usaba Python 2.4 eso no soporta -mjson.tool - jfs

Trata pjson. ¡Tiene colores!

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

Instalarlo con pip:

⚡ pip install pjson

Y luego canalice cualquier contenido JSON a pjson.

respondido 15 nov., 17:23

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

La desventaja es que no es posible grep de la salida en color. - Kristjan Adojaan

yo suelo 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.

respondido 15 nov., 17:23

Gracias, jshon es mucho más rápido que usar Python o Ruby para la misma tarea. Alexander

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

Estoy trabajando con archivos de datos JSON comprimidos de 1 + GB (quién sabe incluso el tamaño sin comprimir), por lo que aprecio mucho la sugerencia de que jshon es más rápido. - ryan ballantyne

Puede utilizar este sencillo comando para lograr el resultado:

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

Respondido 09 Abr '19, 14:04

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. - Eugenio C

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

Hace clasificación en Python 2, en 3 no clasifica github.com/python/cpython/blob/3.8/Lib/json/tool.py - Preguntas difíciles

O, con Ruby:

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

Respondido 21 Oct 09, 10:10

Eso me da un error. ¿Necesita instalar algún paquete ruby ​​json? - mjs

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_json métodos; Kernel#jj solo imprime matrices y hashes de lo mismo (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

Comprar Jazor. Es un analizador JSON de línea de comandos simple escrito en Ruby.

gem install jazor
jazor --help

Respondido el 25 de enero de 11 a las 18:01

¿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 de curl y este es el único que lo hizo por mí. - leo casarani

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

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 - Andrés

JSONLint tiene un implementación de código abierto en GitHub que se puede usar en la línea de comandos o se puede incluir en un proyecto de Node.js.

npm install jsonlint -g

y entonces

jsonlint -p myfile.json

or

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less

Respondido 09 Abr '19, 14:04

Recomiendo no instalar las dependencias de nodejs / npm globalmente => Yo usaría npx en lugar: curl -s "http://api.twitter.com/1/users/show/user.json" | npx jsonlint | less (es decir, no npm install necesario) - adrien joly

Simplemente canalice la salida a jq ..

Ejemplo:

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

Respondido 03 Feb 17, 18:02

Buena respuesta @Ackshaey Singh y también se puede redirigir fácilmente a un archivo. p.ej cat <file_name.txt> | jq . > <output_name.txt> - Pramit

brew install jq si estás en mac os. - disdos

Desafortunadamente, usando jq . para la impresión bonita tiene uno posible inconveniente: 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

@Pramita cat file | es invariablemente un desperdicio de un proceso; solo haz jq . <file_name.txt >output_name.txt (con literal < y > caracteres). - mark Reed

Con Perl, si instala JSON :: PP de CPAN obtendrá el json_pp mando. Robando el ejemplo del B Bycroft usted obtiene:

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

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

contestado el 23 de mayo de 17 a las 12:05

pigmentar

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:

Demo

respondido 15 nov., 17:23

A veces uno necesita usar pygmentize -l json para conseguir la coloración. - JP

Instalar con paquete apt python-pygments, Es decir, apt-get install python-pygments - ene

Simplemente puede usar herramientas estándar como jq o json_pp.

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

or

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.

Respondido el 30 de Septiembre de 19 a las 14:09

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

Recomiendo usar la utilidad de línea de comando json_xs que se incluye en el módulo perl JSON :: XS. JSON :: XS es ​​un módulo de 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 reformatear como Ñame, que algunas personas consideran más legible por humanos que JSON:

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

respondido 15 nov., 17:23

jj es súper rápido, puede manejar documentos JSON descomunales de manera 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

or

jj -p -i input.json

Es (2018) todavía bastante nuevo, por lo que tal vez no maneje JSON inválido de la manera esperada, pero es fácil de instalar en las principales plataformas.

Respondido 02 ago 18, 16:08

bat es un cat clonar con resaltado de sintaxis:

Ejemplo:

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

-p saldrá sin encabezados, y -l especificará explícitamente el idioma.

Tiene colores y formato para JSON y no no tiene los problemas señalados en este comentario: ¿Cómo puedo imprimir JSON en un script de shell?

Respondido 09 Abr '19, 14:04

  1. brew install jq
  2. command + | jq
  3. (ejemplo: curl localhost:5000/blocks | jq)
  4. ¡Que la disfrutes!

enter image description here

Respondido el 15 de Septiembre de 17 a las 21:09

Instale yajl-tools con el siguiente comando:

sudo apt-get install yajl-tools

entonces,

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

Respondido 08 Jul 20, 00:07

Impresionante. No requiere otro idioma / intérprete y está en el repositorio del paquete, ¡no es necesario prepararlo! - jose lujuria

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.