Flask 数据json序列化(四)

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__)

你可能感兴趣的:(Flask 数据json序列化(四))