序列化 SqlAlchemy 的結果爲 json 字符串

在設計 RESTful 的網站時,咱們老是但願 ORM 框架返回的結果是能夠直接給 View 層使用的 JSON 字符串。可是 Sqlalchemy 的返回結果直接使用 json.dumps(res) 會報 TypeError 的錯誤。python

解決方案

其實就像遇到 datetime 沒法使用 json.dumps() 序列化的問題同樣,咱們須要繼承一個json.JSONEncodersql

<!-- lang: python -->
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)
                try:
                    json.dumps(data)     # this will fail on non-encodable values, like other classes
                    fields[field] = data
                except TypeError:    # 添加了對datetime的處理
                    if isinstance(data, datetime.datetime):
                        fields[field] = data.isoformat()
                    elif isinstance(data, datetime.date):
                        fields[field] = data.isoformat()
                    elif isinstance(data, datetime.timedelta):
                        fields[field] = (datetime.datetime.min + data).time().isoformat()
                    else:
                        fields[field] = None
            # a json-encodable dict
            return fields
    
        return json.JSONEncoder.default(self, obj)

參考地址: stackoverflow ,在其基礎上添加了對datatime的一個簡單處理。json

調用的時候以下:框架

c = YourAlchemyClass()
print json.dumps(c, cls=AlchemyEncoder)
相關文章
相關標籤/搜索