Интерактивное исследование JSON-объектов в Jupyter

Работаете с JSON в Jupyter Notebook? Тогда вам понравится вот такой способ интерактивного исследования сложных JSON-объектов, который я утащил с stackoverflow, а туда его утащили с c reddit (автор slashvee), используется пакет renderjson, автор David Caldwell.

In [4]:
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)

Вот так это работает:

In [5]:
gradebook = [{'name': {'first': 'Alice', 'last': 'Carroll'},
              'grades': [3, 4, 5]},
             {'name': {'first': 'Bob', 'last': 'Dylan'},
              'grades': [4, 3, 2, 5]}]
In [6]:
RenderJSON(gradebook)
# потыкайте в плюсики

Вот более серьёзный пример. Запросим какой-нибудь большой и страшный датасет.

In [4]:
import requests
url = "http://openapi.clearspending.ru/restapi/v3/contracts/search/"
data = requests.get(url, dict(customerregion='05', sort='-price')).json()
In [5]:
RenderJSON(data)

И почему я не знал этого раньше?

P.S. Кстати, вы можете добавить код, определяющий класс RenderJSON, в файл ~/.ipython/profile_default/startup/render-json.py и он будет автоматически запускаться при старте нового ноутбука!

Комментарии