Pretty JSON Форматирование в IPython Notebook

Есть ли существующий способ получить вывод json.dumps() для отображения как "симпатичного" отформатированного JSON внутри ipython-ноутбука?

Ответы

Ответ 1

json.dumps имеет аргумент indent, печать результата должна быть достаточной:

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

Ответ 2

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)

Чтобы вывести данные в сворачиваемом формате:

RenderJSON(your_json)

Скопируйте здесь: https://www.reddit.com/r/IPython/comments/34t4m7/lpt_print_json_in_collapsible_format_in_ipython/

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

Ответ 3

Это может немного отличаться от того, что запрашивал OP, но вы можете использовать IPython.display.JSON для интерактивного просмотра объекта JSON/dict.

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

Изменение: это работает в Hydrogen и JupyterLab, но не в Jupyter Notebook или в терминале IPython.

Внутри водорода:

enter image description here enter image description here

Ответ 4

Я нашел эту страницу для поиска способа исключения литерала \n в выходном файле. Мы делаем интервью с использованием Jupyter, и мне нужен способ показать результат функции real perty like. Моя версия Jupyter (4.1.0) не отображает их как фактические разрывы строк. Решение, которое я произвел, (я вроде надеюсь, что это не лучший способ сделать это, но...)

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 automatic newline
for line in line_list:
    print line

Надеюсь, это поможет кому-то!

Ответ 5

Я просто добавляю расширенную переменную в ответ @Kyle Barron:

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

Ответ 6

Если вы хотите, чтобы ваши данные были разборными, используйте этот фрагмент:

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
        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() {
          renderjson.set_show_to_level(1)
          document.getElementById('%s').appendChild(renderjson(%s))
        });
        """ % (self.uuid, self.json_str), raw=True)

и тогда вы можете напечатать свой json как:

RenderJSON({"sag": {"a": 1, "b": 2}})

enter image description here