对于可变类型的json数据,如何反序列化到protobuf?

通过API请求回来的数据,相同字段名的值可能是不同的类型

{
    "data": "data_string"
}

或者

{
    "data": 123
}

我定义了如下的proto message

message Data {
    google.protobuf.Any data = 1;
}

生成对应的golang结构体

type Data struct {
    state         protoimpl.MessageState
    sizeCache     protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    Data *any.Any `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
}

那使用什么反序列化可以把上面的json数据解析到这个对应的结构体中?

如果我的message定义的不正确,那么怎么定义message和怎么反序列化才能将值类型不同的数据正确解析?

阅读 6k
2 个回答

@INFOT Any 的使用示例。

假设存在如下的数据结构:

{
    "type": "",
    "data": {}
}

type 值为 INFO 时,data 的结构为:{ "msg": string; };当 type 值为 ERROR 时,data 的结构为:{ "code": string; "err": string; "reason": string; }

那么,proto 就可以定义为:

message MyData {
    type: string = 1;
    google.protobuf.Any data = 2;
}

message MyInfoData {
    msg: string = 1;
}

message MyErrorData {
    code: int32 = 1;
    err: string = 2;
    reason: string = 3;
}

传输时可以(伪代码):

MyErrorData myError = new MyErrorData() { Code = 1, Err: "", Reason = "" };
MyData myData = new MyData() { Type = "ERROR" };
myData.Data.Pack<MyErrorData>(myError);

// 客户端取值就不写了,反过来 Unpack。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题