You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

54 lines
1.8 KiB

# -*- 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)