import json, types def jschema(json_obj, max_depth=100): '''Takes a json object and returns a schema with type information.''' def rgt(json_obj, level, field_name): if level > max_depth: return elif level == max_depth: term_print(field_name, json_obj, level) return if isinstance(json_obj, types.ListType): lprint('{}: ['.format(field_name), level) if len(json_obj) == 0: term_print(field_name + '.??', None, level + 1) else: rgt(json_obj[0], level + 1, field_name + '.0') lprint(']', level) elif isinstance(json_obj, types.DictType): lprint('{}: {{'.format(field_name), level) if len(json_obj.keys()) == 0: term_print(field_name + '.??', None, level) elif len(json_obj.keys()[0]) == 36: rgt(json_obj[json_obj.keys()[0]], level + 1, field_name + '.child') else: for k in json_obj.keys(): rgt(json_obj[k], level + 1, field_name + '.' + k) lprint('}', level) else: term_print(field_name, json_obj, level) rgt(json_obj, 0, '') def lprint(string_to_print, level): print('{}{}'.format(' ' * level, string_to_print)) def term_print(field_name, json_obj, level): pretty_types = { types.BooleanType: 'Boolean', types.IntType: 'Int', types.UnicodeType: 'String', types.StringType: 'String', types.DictType: 'Object', types.ListType: 'List', types.NoneType: 'Unknown', types.LongType: 'Long', types.FloatType: 'Float' } lprint('{}: {}'.format(field_name, pretty_types[type(json_obj)]), level) if __name__ == '__main__': x = json.load(open('temp.json', 'r')) jschema(x)