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

mic*_*lbn 4 enums json go protocol-buffers grpc

我怎么能转换grpc/ protobuf3消息,JSON其中enum表示为string

例如,protobuf消息:

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

message Http {
    string message = 1;
    Level level = 2;
}
Run Code Online (Sandbox Code Playgroud)

转换为:

j, _ := json.MarshalIndent(protoMessage, "", "\t")
Run Code Online (Sandbox Code Playgroud)

至:

{
    "message": "Hello world!",
    "level": 2,
}
Run Code Online (Sandbox Code Playgroud)

我希望得到:

{
    "message": "Hello world!",
    "level": "SEVERE",
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Eva*_*ran 8

我发现其中一些模块(jsonpb)已被弃用。对我有用的是谷歌编码版本:

import "google.golang.org/protobuf/encoding/protojson"

jsonString := protojson.Format(protoMessage)
Run Code Online (Sandbox Code Playgroud)


mic*_*lbn 6

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

所以:

j, _ := json.MarshalIndent(protoMessage, "", "\t")
Run Code Online (Sandbox Code Playgroud)

应该:

m := jsonpb.Marshaler{}
result, _ := m.MarshalToString(protoMessage)
Run Code Online (Sandbox Code Playgroud)

  • 对于将来阅读本文的任何人,请注意“jsonpb”在此期间已被弃用。正如其他人推荐的那样,“protojson”是新的选择。 (3认同)

sbe*_*rry 3

Level 不是字符串,而是一个 emum。我看到的实际上只有两个选择。

  1. 编写一个自定义编组器来为您执行此操作
  2. 生成为您执行此操作的代码。

对于 #2,gogoprotobuf 有一个扩展(仍然标记为实验性的),可以让你这样做:

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