# -*- coding: utf-8 -*- """ utils.List2Json ~~~~~~~~~~~~~~ Sql_alchemy的实体转json. :copyright: 云南新八达科技有限公司. :author: 李进才. """ import decimal import types from datetime import datetime from flask import json from sqlalchemy.ext.declarative import DeclarativeMeta class AlchemyEncoder(json.JSONEncoder): def default(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']: data = obj.__getattribute__(field) if field == 'query' or field == 'query_class': continue try: # json.dumps(data, ensure_ascii=False) this will fail on non-encodable values, like other classes if str(data) == 'None': data = '' if isinstance(data, types.GeneratorType): data fields[field] = str(data) if isinstance(data, bool) or isinstance(data, int): fields[field] = data if isinstance(data, decimal.Decimal): return (str(data) for data in [data]) except TypeError: fields[field] = None # a json-encodable dict return fields return json.JSONEncoder.default(self, obj) class DecimalEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, decimal.Decimal): return float(obj) if isinstance(obj, datetime): return str(obj) return super(DecimalEncoder, self).default(obj)