Flask 数据json序列化
Flask对数据直接序列化是有要求,对非常规的数据需要进行特殊配置的操作
扩展 JSONEncoder
from datetime import date
from flask.json import JSONEncoder as _JSONEncoder
from flask import Flask as _Flask
# 类变量是不会存储到 dict中,只有实例变量才可以
from app.libs.error_code import ServerError
# 自定义json 序列化器
class JSONEncoder(_JSONEncoder):
def default(self, o):
if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
return dict(o)
if isinstance(o, date):
return o.strftime('%Y-%m-%d')
raise ServerError()
# 使用自己的 json_encoder 代替falsk 原生的 json_encoder
class Flask(_Flask):
json_encoder = JSONEncoder
使用这种方式必须,重写两个方法
在base model中
def __getitem__(self, item):
return getattr(self, item)
def keys(self):
return self.fields
#不需要返回的字段
def hide(self, *keys):
for key in keys:
self.fields.remove(key)
return self
#需要返回的字段
def append(self, *keys):
for key in keys:
self.fields.append(key)
return self
在子类mdoel中:定义默认要返回json的字段
@orm.reconstructor
def __init__(self):
self.fields = ['id', 'title', 'author', 'binding',
'publisher',
'price','pages', 'pubdate', 'isbn',
'summary',
'image']
Python json 序列化相关
python可以直接序列化字典 dict
d ={'name':'flask'}
序列化对象属性不包含对象的实例:
class Demo:
self.name ='falsk'
self.age =34
//直接使用 __dict__
demo.__dict
序列化对象属性含有对象的实例:使用自定义函数
这种思想在 sorted,filter中都有实现,将本身不能实现的规则抛出来,让比人自己实现。
class Demo
self.name ='flask'
self.name =Object
// 直接使用json 中dumps 函数中的 default属性,将不可以序列化的对象转换为可以序列化的字典
json.dumps(books, default=lambda o: o.__dict__)
网友评论