在設計 RESTful 的網站時,咱們老是但願 ORM 框架返回的結果是能夠直接給 View 層使用的 JSON 字符串。可是 Sqlalchemy 的返回結果直接使用 json.dumps(res)
會報 TypeError 的錯誤。python
其實就像遇到 datetime
沒法使用 json.dumps()
序列化的問題同樣,咱們須要繼承一個json.JSONEncoder
。sql
<!-- 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)