Bonito formato JSON en IPython Notebook

2 minutos de lectura

Avatar de usuario de Kyle Brandt
kyle brandt

¿Existe alguna forma de obtener json.dumps() salida para aparecer como JSON con formato “bonito” dentro del cuaderno ipython?

  • la forma más corta es usar pprint() para imprimir el JSON (from pprint import pprint)

    – PJ_

    24 abr a las 21:19


json.dumps tiene un indent argumento, imprimir el resultado debería ser suficiente:

print(json.dumps(obj, indent=2))

  • ¿Qué pasa con los colores en la salida?

    – ganqqwerty

    3 de septiembre de 2015 a las 9:49

  • sin embargo, el carácter chino se confundió con Unicode en este enfoque

    – Luk Aron

    28 de noviembre de 2019 a las 10:26

  • Eso simplemente no es cierto. de pitón json.dumps por defecto a ensure_ascii=True que escapa al punto de código chino (o en realidad: cualquier punto de código que no sea ASCII). Usar print(json.dumps(obj, indent=2, ensure_ascii=False)) y los obtendrás sin escape.

    – filmador

    28 de noviembre de 2019 a las 13:41

Avatar de usuario de Kyle Barron
kyle barron

Esto podría ser ligeramente diferente de lo que OP estaba pidiendo, pero puede usar IPython.display.JSON para ver interactivamente un JSON/dict objeto.

from IPython.display import JSON
JSON({'a': [1, 2, 3, 4,], 'b': {'inner1': 'helloworld', 'inner2': 'foobar'}})

Editar: Esto funciona en Hydrogen y JupyterLab, pero no en Jupyter Notebook o en la terminal IPython.

Adentro Hidrógeno:

ingrese la descripción de la imagen aquí
ingrese la descripción de la imagen aquí

  • ¡Nunca he sido más feliz!

    – Diptangsu Gosvami

    23 de febrero de 2021 a las 8:48

  • me desconcierta que esto funcione en Jupyter Lab, pero no en buenos cuadernos viejos. ahí llama repr_json si está presente.

    – marscher

    29 abr 2021 a las 19:51

Avatar de usuario de Shankar ARUL
Shankar ARUL

import uuid
from IPython.display import display_javascript, display_html, display
import json

class RenderJSON(object):
    def __init__(self, json_data):
        if isinstance(json_data, dict):
            self.json_str = json.dumps(json_data)
        else:
            self.json_str = json_data
        self.uuid = str(uuid.uuid4())

    def _ipython_display_(self):
        display_html('<div id="{}" style="height: 600px; width:100%;"></div>'.format(self.uuid), raw=True)
        display_javascript("""
        require(["https://rawgit.com/caldwell/renderjson/master/renderjson.js"], function() {
        document.getElementById('%s').appendChild(renderjson(%s))
        });
        """ % (self.uuid, self.json_str), raw=True)

Para generar sus datos en formato plegable:

RenderJSON(your_json)

ingrese la descripción de la imagen aquí

Copia pegada de aquí: https://www.reddit.com/r/IPython/comments/34t4m7/lpt_print_json_in_collapsible_format_in_ipython/

GitHub: https://github.com/caldwell/renderjson

  • No puedo hacer que funcione en Jupyter 1.0. ¿Alguna idea de por qué? La consola de Javascript dice: “SyntaxError: token inesperado

    – Pierre Carbonelle

    13 de diciembre de 2016 a las 10:59


  • Hay un problema en el código. La línea 10 debe cambiarse a self.json_str = json_data. Resuelve el problema informado por @user474491.

    – Hasan

    22 de diciembre de 2016 a las 9:51


  • @Hassan: ¡Arreglado! Gracias por la sugerencia.

    – bskaggs

    26 de diciembre de 2016 a las 18:34

  • Actualicé algunos problemas y conseguí que esto funcionara en el último Jupyter Notebook, incluidas las sugerencias de @user474491 y @Hassan, también agregué una llamada explícita a _ipython_display_() en el __init__() para asegurarnos de que podemos intercalar llamadas de forma segura a la interfaz nativa de Python print() y RenderJSON() y aún así hacer que esto funcione gist.github.com/t27/48b3ac73a1479914f9fe9383e5d45325

    – Tarang Shah

    11 de abril de 2018 a las 6:14


  • Acabo de obtener “Error de JavaScript: el requisito no está definido”.

    – Andy

    2 de enero a las 12:43

Solo estoy agregando la variable expandida a la respuesta de @Kyle Barron:

from IPython.display import JSON
JSON(json_object, expanded=True)

Encontré esta página buscando una manera de eliminar el literal \ns en la salida. Estamos haciendo una entrevista de codificación usando Jupyter y quería una forma de mostrar el resultado de una función. perty real como. Mi versión de Jupyter (4.1.0) no los representa como saltos de línea reales. La solución que produje es (espero que esto sea no la mejor manera de hacerlo pero…)

import json

output = json.dumps(obj, indent=2)

line_list = output.split("\n")  # Sort of line replacing "\n" with a new line

# Now that our obj is a list of strings leverage print's automatic newline
for line in line_list:
    print line

¡Espero que esto ayude a alguien!

Para el cuaderno Jupyter, puede ser suficiente generar el enlace para abrir en una nueva pestaña (con el visor JSON de Firefox):

from IPython.display import Markdown
def jsonviewer(d):
   f=open('file.json','w')
   json.dump(d,f)
   f.close()
   print('open in firefox new tab:')
   return Markdown('[file.json](./file.json)')

jsonviewer('[{"A":1}]')
'open in firefox new tab:

archivo.json

Avatar de usuario de Mohit Munjal
Mohit Munjal

Solo una extensión de @filmor respuesta (https://stackoverflow.com/a/18873131/7018342).

Esto codifica elementos que podrían no ser compatibles con json.dumps y también brinda una función útil que se puede usar de la misma manera que usaría imprimir.

import json
class NpEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        if isinstance(obj, np.floating):
            return float(obj)
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        if isinstance(obj, np.bool_):
            return bool(obj)
        return super(NpEncoder, self).default(obj)

def print_json(json_dict):
    print(json.dumps(json_dict, indent=2, cls=NpEncoder))

Uso:

json_dict = {"Name":{"First Name": "Lorem", "Last Name": "Ipsum"}, "Age":26}
print_json(json_dict)
>>>
{
  "Name": {
    "First Name": "Lorem",
    "Last Name": "Ipsum"
  },
  "Age": 26
}

¿Ha sido útil esta solución?