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字典,步骤如下:
- 先导入对应的模块:
from google.protobuf.json_format import MessageToDict
- 修改你的函数,把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
相关产品推荐
相关产品推荐

