極簡單的方式序列化sqlalchemy結果集爲JSON

繼承 json.JSONEncoder

實現一個針對sqlalchemy返回類型的處理方式。

sqlalchemy的返回類型有大都有兩種,一種是Model對象,一種是Query集合(只查詢部分字段)。

針對這兩種返回結果,都是來自同一中類型  sqlalchemy.orm.query.Query 

所以針對Query做相應處理,讓他返回一個dict

 

class AlchemyJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        # 判斷是否是Query
        if isinstance(obj, Query):
            # 定義一個字典數組
            fields = []
            # 定義一個字典對象
            record = {}
            # 檢索結果集的行記錄
            for rec in obj.all():
                # 檢索記錄中的成員
                for field in [x for x in dir(rec) if
                              # 過濾屬性
                              not x.startswith('_')
                              # 過濾掉方法屬性
                              and hasattr(rec.__getattribute__(x), '__call__') == False
                              # 過濾掉不需要的屬性
                              and x != 'metadata']:
                    data = rec.__getattribute__(field)
                    try:
                        record[field] = data
                    except TypeError:
                        record[field] = None
                fields.append(record)
            # 返回字典數組
            return fields
        # 其他類型的數據按照默認的方式序列化成JSON
        return json.JSONEncoder.default(self, obj)

  

這樣在每次序列化的時候就可以簡單的使用

json.dumps(result1, cls=AlchemyJsonEncoder)

來實現對結果集的json序列化了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章