您的位置:首页 > Web前端 > JavaScript

[Python] One utility class for JSON output

2014-01-17 16:44 597 查看
from sqlalchemy.orm.attributes import InstrumentedAttribute
import datetime

class JsonUtils:
entity_superclass = 'sqlalchemy.ext.declarative.Base'

def __init__(self, depth=1):
self.visited_entities = set()
self.depth = depth

def reset(self):
self.visited_entities = set()

def tojson(self, o):
return self._tojson(o, 1)

def _tojson(self, o, level):
if o == None:
return o
elif isinstance(o, (str, int, float)):
return o
elif isinstance(o, (datetime.datetime, datetime.date, datetime.time)):
return str(o)
elif isinstance(o, list):
return self._tojson_list(o, level)
elif isinstance(o, dict):
return self._tojson_dict(o, level)
elif self._get_superclass(o) == self.entity_superclass:
if o not in self.visited_entities and level <= self.depth:
self.visited_entities.add(o)
level += 1
return self._tojson_entity(o, level)
else:
raise MaxDepthException()
else:
return str(o)

def _tojson_list(self, l, level):
result = []
for i in l:
result.append(self._tojson(i, level))
return result

def _tojson_dict(self, d, level):
result = {}
for k in d.keys():
result[k] = self._tojson(d[k], level)
return result

def _tojson_entity(self, e, level):
result = {}
cls = e.__class__
attribs = cls.__dict__
for k in attribs.keys():
v = attribs[k]
if isinstance(v, InstrumentedAttribute) or k == '_type':
try:
attrvalue = e.__getattribute__(k)
result[k] = self._tojson(attrvalue, level)
except MaxDepthException:
pass
except:
print "__getattribute__(%s) failed" % k
return result

def _get_superclass(self, o):
return o.__class__.__base__.__module__ + '.' + o.__class__.__base__.__name__

def fromjson(self, o):
pass

class MaxDepthException(Exception):
pass
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐