【问题标题】:Converting Protobuf3 with enum to JSON in Go在 Go 中将带有枚举的 Protobuf3 转换为 JSON
【发布时间】:2018-10-02 10:12:42
【问题描述】:

如何将grpc/protobuf3 消息转换为JSON,其中enum 表示为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",
}

谢谢

【问题讨论】:

    标签: json go enums protocol-buffers grpc


    【解决方案1】:

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

    所以:

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

    应该是:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • gogo 不是我的特定问题所必需的。感谢您的推荐,它可能有助于解决其他问题
      • 当前的 golang protobuf lib (v1.3) 已经用字符串替换了枚举值。但是,要使默认值可见,您必须将 Marshaler 'EmitDefaults' 选项设置为 true:jsonpb.Marshaler{ EmitDefaults: true, }
      【解决方案3】:

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

      import "google.golang.org/protobuf/encoding/protojson"
      
      jsonString := protojson.Format(protoMessage)
      

      【讨论】:

        【解决方案4】:

        当涉及到序列化 json 对象时,这会很有帮助。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-07
          • 2020-08-21
          • 2021-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多