猿问

golang protobuf 从生成的 json 标签中删除 omitempty 标签

我正在使用带有 json 代理的 google grpc。出于某种原因,我需要omitempty从 *.pb.go 文件中生成的结构中删除标签。


如果我有这样的原始消息


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从生成的结构中删除标签。我怎样才能做到这一点?


繁花如伊
浏览 276回答 3
3回答

阿晨1998

如果您使用的是 grpc-gateway 并且您需要在 json 编组期间提供默认值,您可以考虑在创建您的 servemux 时添加以下选项    gwmux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true, EmitDefaults: true}))在 grpc-gateway 之外,如果要编组 protocul 缓冲区消息,请使用github.com/golang/protobuf/jsonpbpackage 而不是encoding/jsonfunc sendProtoMessage(resp proto.Message, w http.ResponseWriter) {    w.Header().Set("Content-Type", "application/json; charset=utf-8")    m := jsonpb.Marshaler{EmitDefaults: true}    m.Marshal(w, resp) // You should check for errors here}

守候你守候我

 便携式解决方案:用于sed生成 via 后剥离标签protoc。在生成 *.pb.go 文件后,我在 go:generate 脚本中实际使用的示例:ls *.pb.go | xargs -n1 -IX bash -c 'sed s/,omitempty// X > X.tmp && mv X{.tmp,}'注意:sed -i此处不使用 (inline-replacement),因为该标志在标准 OS-X 和 Linux 之间不可移植。

摇曳的蔷薇

您可以尝试使用 gogo proto ( https://github.com/gogo/protobuf ) 使用 jsontag 扩展名,您的 proto 消息看起来像message Status {  int32 code = 1 [(gogoproto.jsontag) = "code"];  string message = 2 [(gogoproto.jsontag) = "message"];}如果愿意,您还可以添加更多标签。
随时随地看视频慕课网APP

相关分类

Go
我要回答