json.dumps()默认不支持set/frozenset/bytes,需通过default参数或自定义JSONEncoder处理:set/frozenset转list,bytes用base64编码或UTF-8解码,且须确保嵌套元素本身可序列化。

json.dumps() 默认不支持 set / frozenset / bytes 怎么办
直接调用 json.dumps() 序列化含 set、frozenset 或 bytes 的对象会抛出 TypeError: Object of type set is not JSON serializable。这不是 bug,而是 JSON 标准本身不定义这些类型——Python 的 json 模块严格遵循该限制,不会自动降级或猜测意图。
用 default 参数把不可序列化对象转成 dict/list/str
default 是最常用也最可控的方式:它接收一个函数,当遇到无法序列化的对象时,由你决定返回什么合法的 JSON 类型(如 list、str、dict)。
典型做法:
-
set和frozenset→ 转为list(保持元素可序列化前提下) -
bytes→ 先用.decode('utf-8')(若确定是 UTF-8),或用base64.b64encode(x).decode('ascii')保全二进制语义 - 其他未知类型建议抛出原异常,避免静默错误
示例:
import json
import base64
<p>def json_fallback(obj):
if isinstance(obj, (set, frozenset)):
return list(obj)
elif isinstance(obj, bytes):
return base64.b64encode(obj).decode('ascii')
raise TypeError(f"Object of type {type(obj).<strong>name</strong>} is not JSON serializable")</p><p>data = {"tags": {"python", "web"}, "payload": b"