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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:17:32