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

发布于 2022-09-12 03:15:24 字数 674 浏览 15 评论 0

通过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和怎么反序列化才能将值类型不同的数据正确解析?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最偏执的依靠 2022-09-19 03:15:24

@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。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文