Protobuf反序列化缺失外层key 'answerUpdateRequest' 如何解决?
解决方案
Protobuf的AnswerUpdateRequest本身就是顶层消息,反序列化后默认只会返回该消息的内容结构,不会自动添加外层的answerUpdateRequest键。要得到预期结构,有两种可行方法:
方法一:手动包装反序列化结果
反序列化完成后,将结果放入字典中手动添加外层键,无需修改Protobuf定义:
import events_pb2 import json from google.protobuf.json_format import MessageToDict # serialized_data为序列化后的字节数据 request = events_pb2.AnswerUpdateRequest() request.ParseFromString(serialized_data) # 转换为字典并添加外层包装 result = { "answerUpdateRequest": MessageToDict(request, preserving_proto_field_name=True) } # 转为带缩进的JSON字符串 json_result = json.dumps(result, indent=2) print(json_result)
方法二:修改Protobuf定义添加外层包装消息
如果希望序列化时就包含外层结构,可以修改file.proto,新增一个顶层包装消息:
syntax = "proto3"; package com.oracle; import "file2.proto"; option go_package = "github.com/cle/sdk/go_sdk"; // 新增外层包装消息 message AnswerUpdateRequestWrapper { AnswerUpdateRequest answerUpdateRequest = 1; } // 原消息保持不变 message AnswerUpdateRequest { Entity entity = 1; repeated Answer answers = 2; } message AnswersUpdated { Entity entity = 1; repeated Answer answers = 2; }
修改后重新生成Python代码,序列化时使用AnswerUpdateRequestWrapper包装原请求:
def create_answer_update_request(json_data): data = json_data wrapper = events_pb2.AnswerUpdateRequestWrapper() answer_update_request = wrapper.answerUpdateRequest # 后续填充逻辑与原代码一致... return wrapper.SerializeToString()
这样反序列化后,直接转换为字典就会包含answerUpdateRequest外层键。
内容的提问来源于stack exchange,提问作者Xi12
相关产品推荐
相关产品推荐

