Source code for jsonhumanize.jsonhumanize
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import collections
import json
from lxml.html.builder import TABLE, TH, TD, TR, CLASS, SPAN
import lxml.html
[docs]class JsonHuman(object):
"""Convert JSON to human readable HTML
Process a JSON string and produce a styled HTML table for improve human
readability.
"""
def __init__(self, keep_order=False, **kwargs):
super(JsonHuman, self).__init__(**kwargs)
self.__keep_order = keep_order
def __parse(self, json_obj, first=False):
"""Process a parsed JSON to HTML table"""
if isinstance(json_obj, dict):
type_class = 'jh-type-object'
key_class = 'jh-object-key'
value_class = 'jh-object-value'
obj = json_obj.items()
else:
type_class = 'jh-type-array'
key_class = 'jh-array-key'
value_class = 'jh-array-value'
obj = enumerate(json_obj)
if first:
type_class = "%s %s" % (type_class, 'jh-root')
rows = []
for key, value in obj:
th = TH(
CLASS('jh-key %s' % key_class),
str(key)
)
if isinstance(value, bool):
content = SPAN(
CLASS('jh-type-bool'),
('true' if value else 'false')
)
elif isinstance(value, int):
content = SPAN(
CLASS('jh-type-int jh-type-number'),
"%d" % value
)
elif isinstance(value, float):
content = SPAN(
CLASS('jh-type-float jh-type-number'),
"%.2f" % value
)
elif hasattr(value, '__iter__'):
content = self.__parse(value)
else:
content = SPAN(
CLASS('jh-type-string'),
'"%s"' % str(value)
)
td = TD(
CLASS(value_class),
content
)
rows.append(
TR(
th,
td
)
)
html = TABLE(
CLASS(type_class),
*rows
)
return html