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