在设计 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)