Python2.7转3.5时json.dumps报TypeError:字节类型键非字符串
解决Python 3.5 JSON序列化时bytes类型键的报错问题
这个问题我之前迁移Python版本时也碰到过,核心原因是Python 3对字符串和字节类型的区分更严格——Python 2里bytes和str的边界比较模糊,json.dumps()能兼容处理,但Python 3的JSON模块明确要求字典的键必须是字符串类型,bytes类型的键会直接抛出TypeError。
具体解决思路
我们需要把backlog字典中所有的bytes类型(包括嵌套结构里的键和值)递归转换为Python 3的str类型,再进行JSON序列化。
实现代码
先写一个递归转换的工具函数,能处理嵌套的字典、列表和bytes对象:
def convert_bytes_to_str(obj): # 处理字典:遍历所有键值对,转换bytes键和对应值 if isinstance(obj, dict): return { k.decode('utf-8'): convert_bytes_to_str(v) for k, v in obj.items() } # 处理列表:遍历每个元素做转换 elif isinstance(obj, list): return [convert_bytes_to_str(item) for item in obj] # 处理bytes对象:解码为字符串 elif isinstance(obj, bytes): return obj.decode('utf-8') # 其他类型直接返回,不做处理 else: return obj
然后修改你的序列化代码(顺便用更安全的with语句管理文件,避免手动关闭遗漏):
import json # 先转换所有bytes类型为字符串 backlog_converted = convert_bytes_to_str(backlog) # 再进行JSON序列化 backlog_json = json.dumps(backlog_converted, indent=2, sort_keys=True) # 用with语句自动管理文件的打开和关闭 with open(backlog_path, "wt") as f: f.write(backlog_json)
注意事项
- 如果你的字节数据不是UTF-8编码的,可以修改
decode()的参数,比如decode('latin-1'),根据实际数据的编码格式调整。 - 如果你能控制
backlog的生成源头(比如从文件、网络读取数据时),最好在生成backlog的阶段就直接转成字符串类型,这样比后期递归转换更高效。
内容的提问来源于stack exchange,提问作者p0nts
相关产品推荐
相关产品推荐

