[英]unmarshal yaml to proto3 with oneOf protobuf field
我有一个结构如下的原始消息:
syntax = "proto3";
message Bar {
int64 id = 1;
string name = 2;
int64 value = 3;
}
message Msg {
int32 baz = 1;
oneof some_union {
string foo = 2;
Bar bar = 3;
}
}
我可以想到两种方法来编写等效于消息的 yaml。 在第一种方法中,请参见下面的示例,它分配"some_union": null
并且在“foo”字段中未设置任何值。
baz: 0
foo: "some_string"
在第二种方法中,请参见下面的示例,它会抛出一个错误,指出cannot unmarshal object into Go struct field
baz: 0
some_union:
foo: "some_string"
我正在使用github.com/ghodss/yaml
package 将 yaml 解组为原始消息。
您需要使用protojson.Unmarshal
从oneOf
字段中正确获取值。
我创建了以下原型定义
message Person {
string name = 1;
int32 id = 2;
string email = 3;
oneof avatar {
string imageUrl = 4;
bytes imageData = 5;
}
}
然后我能够创建一个 YAML 文件,可以正确读取。
---
name: Harry Potter
id: 1
email: harry@potter.com
imageUrl: https://picsum.photos/id/1005/200
唯一的问题是,如果我执行以下操作,
yamlBytes, _ := ioutil.ReadFile("testdata/person.yaml")
person := &pb.Person{}
yaml.Unmarshal(yamlBytes, person)
就像您提到的那样,未设置imageUrl
的值。
您需要这样做 - 首先将 YAML 转换为 JSON,然后使用protojson.Unmarshal
yamlBytes, _ := ioutil.ReadFile("testdata/person.yaml")
person := &pb.Person{}
jsonBytes, _ := yaml.YAMLToJSON(yamlBytes)
protojson.Unmarshal(jsonBytes, person)
然后你就设置了正确的imageUrl
值。
这是完整代码的链接 - https://github.com/mbtamuli/GoLearnGo/tree/master/protobufs 。 您可以在这里看到它的实际效果 - https://replit.com/@mbtamuli/didactic-train
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.