flask查询User,返回对象列表,提示ypeError: Object of type ‘bytes‘ is not JSON serializable解决办法

Posted 月疯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask查询User,返回对象列表,提示ypeError: Object of type ‘bytes‘ is not JSON serializable解决办法相关的知识,希望对你有一定的参考价值。

先把对象转换字典:

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.INTEGER,primary_key=True)
    login_name = db.Column(db.String(80),unique=True)
    create_time = db.Column(db.String(80),nullable=False)
    sex = db.Column(db.String(80),nullable=False)
    cellphone = db.Column(db.String(80),nullable=False)
    cname = db.Column(db.String(80),nullable=False)
    password = db.Column(db.String(80),nullable=False)
    head_portrait = db.Column(db.String(80),nullable=False)
    birthday = db.Column(db.String(80),nullable=False)
    stature = db.Column(db.String(80),nullable=False)
    weight = db.Column(db.String(80),nullable=False)
    medical_history = db.Column(db.String(80),nullable=False)
    update_time = db.Column(db.String(80),nullable=False)
    location = db.Column(db.String(80),nullable=False)
    blood_glucose = db.Column(db.String(80),nullable=False)
    lastLoginTime = db.Column(db.String(80),nullable=False)
    newUploadTime = db.Column(db.String(80),nullable=False)
    identity = db.Column(db.String(80),nullable=False)
    deviceid = db.Column(db.String(80),nullable=False)
    head_portrait_time = db.Column(db.String(80),nullable=False)
    accid = db.Column(db.String(80),nullable=False)
    token = db.Column(db.String(80),nullable=False)
    wallet = db.Column(db.String(80),nullable=False)
    idcardNum = db.Column(db.String(80),nullable=False)
    faith = db.Column(db.String(80),nullable=False)
    nation = db.Column(db.String(80),nullable=False)
    status = db.Column(db.String(80),nullable=False)
    country_code = db.Column(db.String(80),nullable=False)
    time_diff = db.Column(db.String(80),nullable=False)
    final_phone = db.Column(db.String(80),nullable=False)
    enterprise_id = db.Column(db.String(80),nullable=False)
    thirdUserid = db.Column(db.String(80),nullable=False)
    isDoctor = db.Column(db.String(80),nullable=False)
    isNurse = db.Column(db.String(80),nullable=False)
    imAccid = db.Column(db.String(80),nullable=False)
    payPassWord = db.Column(db.String(80),nullable=False)
    isCancel = db.Column(db.String(80),nullable=False)
    recommendUser = db.Column(db.String(80),nullable=False)

    def keys(self):
        return ('id','login_name','create_time','sex','cellphone','cname','password','head_portrait','birthday','stature','weight','medical_history','update_time','location','blood_glucose','lastLoginTime','newUploadTime','identity','deviceid','head_portrait_time','accid','token','wallet','idcardNum','faith','nation','status','country_code','time_diff','final_phone','enterprise_id','thirdUserid','isDoctor','isNurse','imAccid','payPassWord','isCancel','recommendUser')

    def __getitem__(self, item):
        return getattr(self, item)

很关键的俩个方法: 

def keys(self):

def __getitem__(self,item)

 然后调用对象的dict()fang方法。

@app.route('/select_user')
def select_user():
    # 查询所有用户
    users_list = User.query.all()
    list = [dict(i) for i in users_list]
    return json.dumps(list,cls=DateEncoder,indent=4)

给前端返回去一个json,又出问题:

提示:ypeError: Object of type 'bytes' is not JSON serializable

import json
class MyEncoder(json.JSONEncoder):

    def default(self, obj):
        """
        只要检查到了是bytes类型的数据就把它转为str类型
        :param obj:
        :return:
        """
        if isinstance(obj, bytes):
            return str(obj, encoding='utf-8')
        return json.JSONEncoder.default(self, obj)

解决了,网上找到的

又提示:Object of type 'datetime' is not JSON serializable

import json
import datetime
class DateEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, datetime.date):
            return obj.strftime("%Y-%m-%d")
        
        else:
            return json.JSONEncoder.default(self, obj)

解决掉了,最后想着结合一下:

import json
import datetime
class DateEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, datetime.date):
            return obj.strftime("%Y-%m-%d")
        elif isinstance(obj, bytes):
            return str(obj, encoding='utf-8')
        else:
            return json.JSONEncoder.default(self, obj)

就彻底好了,

瞬间好了,很欣慰撒。。。。。。。。。。。。。。。

贴个图,下班回家。

 

 

以上是关于flask查询User,返回对象列表,提示ypeError: Object of type ‘bytes‘ is not JSON serializable解决办法的主要内容,如果未能解决你的问题,请参考以下文章

flask-SQLAlchemy怎么查询具体字段

flask-SQLAlchemy怎么查询具体字段

Flask 返回一个正确的列表对象以在 Postman 中进行测试

Python 和 Flask 如何返回列表? [复制]

从 SQLalchemy Flask 中的连接表返回填充字段

GraphQL 嵌套查询返回 null