首页 >后端开发 >Golang >如何从 Protocol Buffer 结构中的 JSON 中删除 `omitempty` 标签?

如何从 Protocol Buffer 结构中的 JSON 中删除 `omitempty` 标签?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-14 16:45:111001浏览

How to Remove `omitempty` Tags from JSON in Protocol Buffer Structs?

如何从 Protocol Buffer 结构中生成的 JSON 标签中删除 Omitempty 标签

在某些用例中,可能需要删除为协议缓冲区结构生成的 JSON 标签中的 omitempty 标签。 Protocol buffers,特别是与 gRPC 一起使用时,是数据序列化和传输的强大工具。但是,包含 omitempty 标记可能会导致在 JSON 封送过程中遗漏默认值或空值,这可能是不可取的。

问题

使用时使用 JSON 代理的协议缓冲区,生成的结构可能在 JSON 标签中包含 omitempty 标签,如示例中所示下面:

message Status {
  int32 code = 1;
  string message = 2;
}

生成的结构体:

type Status struct {
  Code int32 `protobuf:"varint,1,opt,name=code" json:"code,omitempty"`
  Message string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
}

解决方案

要从生成的结构体中删除 omitempty 标签,有有两种可能的方法:

  1. 使用grpc-gateway: 如果您使用 grpc-gateway,您可以使用以下选项配置servemux:
gwmux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true, EmitDefaults: true}))
  1. 使用 google.golang.org /protobuf/encoding/protojson: 对于 grpc-gateway 之外的应用程序,您可以使用google.golang.org/protobuf/encoding/protojson 包而不是标准的编码/json 进行封送。该包提供了对编组过程的更好控制,包括发出默认值的能力:
func sendProtoMessage(resp proto.Message, w http.ResponseWriter) {
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    m := protojson.Marshaler{EmitDefaults: true}
    m.Marshal(w, resp) // You should check for errors here
}

通过实现其中一种方法,您可以有效地从为以下内容生成的 JSON 标签中删除 omitempty 标签:您的协议缓冲区结构,确保在 JSON 封送过程中包含默认值或空值。

以上是如何从 Protocol Buffer 结构中的 JSON 中删除 `omitempty` 标签?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn