繁体   English   中英

使用 oneOf protobuf 字段将 yaml 解组到 proto3

[英]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 解组为原始消息。

tl;博士;

您需要使用protojson.UnmarshaloneOf字段中正确获取值。


我创建了以下原型定义

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM