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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:27:27