You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JWT.encode报‘bytes类型无法JSON序列化’错误如何解决?

解决TypeError: Object of type 'bytes' is not JSON serializable问题

这个错误本质是JSON无法序列化bytes类型的对象,结合你的代码来看,主要有两个核心问题和对应的修复方案:

1. 立刻移除返回的密码字段(安全+序列化双重修复)

你当前的selected_user字典里包含了password字段,而bcrypt加密后的密码通常是以bytes类型存储在数据库中的,把它放进要返回的响应字典里,必然触发序列化错误。更重要的是——登录成功后绝对不能把密码返回给前端,这是严重的安全漏洞!

所以第一步先删掉password字段:

selected_user = {
    'email': user.__dict__['email'],
    'account_type': user.__dict__['account_type'],
    'token': ''
}

2. 将生成的token转为字符串

假设你是用PyJWT这类库生成token,部分版本的库返回的token是bytes类型,这时候需要用.decode('utf-8')把它转成字符串再赋值:

比如补全你的token生成逻辑后:

import jwt

# 补全payload,建议加入过期时间等必要字段
payload = {
    'email': user.email,
    'account_type': user.account_type,
    'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=24)  # 示例:24小时过期
}
secret_key = "你的密钥字符串"
# 生成token,若返回bytes则转成字符串
token = jwt.encode(payload, secret_key, algorithm='HS256')
if isinstance(token, bytes):
    token = token.decode('utf-8')

# 赋值给selected_user
selected_user['token'] = token

额外优化:避免直接访问__dict__

直接操作user.__dict__不够优雅,如果你的user对象是ORM模型(比如Django User、SQLAlchemy实例),直接访问属性更安全简洁:

selected_user = {
    'email': user.email,
    'account_type': user.account_type,
    'token': ''
}

这样修改后,你的响应字典里所有值都是JSON可序列化的类型,就不会再触发那个错误了。

内容的提问来源于stack exchange,提问作者methuselah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:47:54