#coding:utf-8
from json importdumps, loads, JSONEncoder, JSONDecoderimportpicklefrom app.model.Jsonable importJsonablefrom sqlalchemy.ext.declarative importDeclarativeMetaimportjirafrom jira.resources importUserimportdatetimeimportjson#python对象编码为json对象统一方法,用法为 json.dumps(project, cls=PythonObjectEncoder)
classPythonObjectEncoder(JSONEncoder):defdefault(self, obj):ifisinstance(obj, (list, dict, str, int, float, bool, type(None), Jsonable, jira.resources.Resource)):
fields={}for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']:
data= obj.__getattribute__(field)try:#this will fail on non-encodable values, like other classes
dumps(data)
fields[field]=dataexceptTypeError:
fields[field]=None#a json-encodable dict
returnfieldsreturnJSONEncoder.default(self, obj)classAlchemyEncoder(json.JSONEncoder):defdefault(self, obj):if isinstance(obj.__class__, DeclarativeMeta):#an SQLAlchemy class
fields ={}#for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata' and not hasattr(obj.__class__.__bases__,x)]:
for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata' and x != 'query' and x != 'query_class']:
data= obj.__getattribute__(field)try:#this will fail on non-encodable values, like other classes
json.dumps(data)
fields[field]=dataexcept TypeError: #添加了对datetime的处理
ifisinstance(data, datetime.datetime):#fields[field] = data.isoformat()
fields[field] = data.strftime('%Y-%m-%d %H:%M:%S')elifisinstance(data, datetime.date):#fields[field] = data.isoformat()
fields[field] = data.strftime('%Y-%m-%d')elifisinstance(data, datetime.timedelta):
fields[field]=(
datetime.datetime.min+data).time().isoformat()#elif isinstance(data.__class__, DeclarativeMeta):
#json.dumps(data,cls=AlchemyEncoder)
#pass
else:
fields[field]=None#a json-encodable dict
returnfieldsreturnjson.JSONEncoder.default(self, obj)classDateTimeEncoder(json.JSONEncoder):defdefault(self, obj):ifisinstance(obj, datetime.datetime):return obj.strftime('%Y-%m-%d %H:%M:%S')elifisinstance(obj, datetime.date):return obj.strftime('%Y-%m-%d')elif isinstance(obj.__class__, DeclarativeMeta):return dumps(obj,cls=AlchemyEncoder)else:returnjson.JSONEncoder.default(self, obj)classModelToJsonObject(object):defto_json(self,obj):if isinstance(obj.__class__, DeclarativeMeta):returnjson.loads(json.dumps(obj,AlchemyEncoder))else:return json.loads