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

Python中JSON序列化报错:自定义格式结果无法jsonify求助

解决Python JSON序列化Protobuf对象的错误

我一眼就看出问题所在了——你尝试序列化的result是一个Protocol Buffers(protobuf)对象,而Python标准库的JSON编码器(jsonify底层依赖它)只能处理原生Python类型(比如字典、列表、字符串、数字等),不认识这种自定义的protobuf实例,所以才会抛出TypeError: ... is not JSON serializable。

下面给你两种实用的解决方法:

方法1:利用Protobuf自带工具转成字典

Protobuf官方提供了转换工具,可以直接把protobuf对象转成JSON兼容的Python字典,步骤如下:

  1. 先导入对应的模块:
from google.protobuf.json_format import MessageToDict
  1. 修改你的函数,把protobuf对象转成字典后再序列化:
def ss():
    # 你的原有逻辑,生成result这个protobuf对象
    # 将protobuf对象转为Python字典
    result_dict = MessageToDict(result)
    # 现在可以正常jsonify了
    return jsonify({'result': result_dict})

这个方法的好处是不需要手动提取字段,自动处理所有protobuf结构,适合复杂的对象。

方法2:手动提取需要的字段构造字典

如果你的protobuf结构比较简单,或者只需要其中部分字段,也可以手动提取数据构造原生字典:

def ss():
    # 假设你的result结构是包含outputs列表,取第一个output
    target_output = result.outputs[0]
    # 构造JSON可序列化的字典
    result_dict = {
        "key": target_output.key,
        "dtype": target_output.value.dtype,
        "float_val": target_output.value.float_val
    }
    return jsonify({'result': result_dict})

这种方法更灵活,能精准控制最终JSON的结构,避免不必要的字段。

补充说明

为什么原来的代码会报错?因为jsonify本质上是调用Python标准库的json.dumps(),而json模块的默认编码器遇到非原生类型时,会调用default方法,这个方法默认只处理原生类型,遇到protobuf这种自定义对象就会抛出TypeError。我们上面的两种方法都是把protobuf对象转换成了JSON编码器能识别的原生字典类型,所以就能正常序列化了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:50:11