在Go中将带有枚举的Protobuf3转换为JSON

时间:2018-04-22 05:41:41

标签: json go enums protocol-buffers grpc

如何将grpc / protobuf3邮件转换为JSONenum表示为string

例如,protobuf消息:

enum Level {
    WARNING = 0;
    FATAL = 1;
    SEVERE = 2;
    ...
}

message Http {
    string message = 1;
    Level level = 2;
}

转换为:

j, _ := json.MarshalIndent(protoMessage, "", "\t")

要:

{
    "message": "Hello world!",
    "level": 2,
}

我希望得到:

{
    "message": "Hello world!",
    "level": "SEVERE",
}

由于

3 个答案:

答案 0 :(得分:3)

Level不是一个字符串,它是一个emum。我看到的确只有两种选择。

  1. 编写一个为您执行此操作的自定义编组程序
  2. 生成为您执行此操作的代码。
  3. 对于#2,gogoprotobuf有一个扩展名(仍然标记为实验性),让你做到这一点:

    https://godoc.org/github.com/gogo/protobuf/plugin/enumstringerhttps://github.com/gogo/protobuf/blob/master/extensions.md

答案 1 :(得分:3)

我发现我应该使用protobuf/jsonpb包而不是标准json包。

这样:

j, _ := json.MarshalIndent(protoMessage, "", "\t")

应该是:

m := jsonpb.Marshaler{}
result, _ := m.MarshalToString(protoMessage)

答案 2 :(得分:0)

当序列化json对象时,这将很有帮助。

var msg bytes.Buffer
m := jsonpb.Marshaler{}
err := m.Marshal(&msg, event)

msg.Bytes()msg转换为字节流。