¿Cómo imprimir un archivo JSON?

Resuelto Colleen asked hace 12 años • 15 respuestas

¿Cómo imprimo un archivo JSON en Python?

Colleen avatar Oct 18 '12 04:10 Colleen
Aceptado

Utilice el indent=parámetro de json.dump()o json.dumps()para especificar cuántos espacios sangrar:

>>> import json
>>> your_json = '["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> parsed = json.loads(your_json)
>>> print(json.dumps(parsed, indent=4))
[
    "foo",
    {
        "bar": [
            "baz",
            null,
            1.0,
            2
        ]
    }
]

Para analizar un archivo, use json.load():

with open('filename.txt', 'r') as handle:
    parsed = json.load(handle)
Blender avatar Oct 17 '2012 21:10 Blender

Puedes hacer esto en la línea de comando:

python3 -m json.tool some.json

(como ya se mencionó en los comentarios a la pregunta, gracias a @Kai Petzke por la sugerencia de python3).

En realidad, Python no es mi herramienta favorita en lo que respecta al procesamiento json en la línea de comando. Para una impresión sencilla y bonita está bien, pero si desea manipular el json, puede volverse demasiado complicado. Pronto necesitarás escribir un archivo de script separado, podrías terminar con mapas cuyas claves sean "alguna clave" (python Unicode), lo que dificulta la selección de campos y realmente no va en la dirección de ser bonito. -impresión.

También puedes usar jq :

jq . some.json

y obtienes colores como beneficio adicional (y una extensibilidad mucho más fácil).

Anexo: Hay cierta confusión en los comentarios acerca del uso de jq para procesar archivos JSON grandes, por un lado, y de tener un programa jq muy grande, por el otro. Para imprimir un archivo que consta de una única entidad JSON grande, la limitación práctica es la RAM. Para imprimir un archivo de 2 GB que consta de una única matriz de datos del mundo real, el "tamaño máximo del conjunto residente" requerido para la impresión bonita era de 5 GB (ya sea usando jq 1.5 o 1.6). Tenga en cuenta también que jq se puede utilizar desde Python después de pip install jq.

Gismo Ranas avatar Aug 26 '2015 13:08 Gismo Ranas

Después de leer los datos con el jsonmódulo de biblioteca estándar, utilice el módulo de biblioteca estándar pprint para mostrar los datos analizados. Ejemplo:

import json
import pprint

json_data = None
with open('file_name.txt', 'r') as f:
    data = f.read()
    json_data = json.loads(data)

# print json to screen with human-friendly formatting
pprint.pprint(json_data, compact=True)

# write json to file with human-friendly formatting
pretty_json_str = pprint.pformat(json_data, compact=True).replace("'",'"')

with open('file_name.json', 'w') as f:
    f.write(pretty_json_str)

El valor predeterminado indentes 1, por lo que es posible que desees especificar el tuyo propio.

De forma predeterminada, pprint generará listas como esta:

'not compact': ['pprint',
                'will',
                'output',
                'lists',
                'like',
                'this'],

Y eso no es mejor que json.dump()o json.dumps()con un indentespecificado.

Con compact=True , pprint generará listas similares a esta:

'compact': ['pprint', 'with compact=True', 'will', 'output',
            'lists', 'like', 'this'],

Tenga en cuenta que puede especificar dónde se ajustará con el widthargumento.

Es necesario reemplazar 'comillas simples' con 'comillas dobles' en la cadena devuelta por pprint.pformat(), porque las comillas simples no son json válidos. Cuando mira el archivo en su editor de texto, es posible que no pueda resaltar el json correctamente.

En cualquier caso, es posible que quieras guardarlo como json válido, para que puedas, como humano, simplemente leer tus archivos json cómodamente, si no es más importante que estén formateados sin espacios para que puedan ser procesados ​​por computadora con cegamiento. velocidad.

Al final, el resultado se verá así:

{'address': {'city': 'New York',
             'postalCode': '10021-3100',
             'state': 'NY',
             'streetAddress': '21 2nd Street'},
 'age': 27,
 'children': [],
 'firstName': 'John',
 'isAlive': True,
 'lastName': 'Smith'}
ikreb avatar Jan 05 '2018 10:01 ikreb