为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁花如伊 2021-12-07 10:01:44
我正在使用带有 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从生成的结构中删除标签。我怎样才能做到这一点?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

如果您使用的是 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/json


func 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

}


查看完整回答
反对 回复 2021-12-07
?
守候你守候我

TA贡献1802条经验 获得超10个赞

 便携式解决方案:

用于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 之间不可移植。


查看完整回答
反对 回复 2021-12-07
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

您可以尝试使用 gogo proto ( https://github.com/gogo/protobuf ) 使用 jsontag 扩展名,您的 proto 消息看起来像


message Status {

  int32 code = 1 [(gogoproto.jsontag) = "code"];

  string message = 2 [(gogoproto.jsontag) = "message"];

}

如果愿意,您还可以添加更多标签。


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 275 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信