我正在使用带有JSON代理的谷歌grpc。由于某种原因,我需要从 *.pb.go文件中生成的结构中删除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
标记,我该怎么做呢?
8条答案
按热度按时间qc6wkl3g1#
如果您使用的是grpc-gateway,并且需要在json封送处理期间提供缺省值,则可以考虑在创建servemux时添加以下选项
在grpc-gateway之外,如果要编组协议缓冲区消息,请使用
google.golang.org/protobuf/encoding/protojson
(*)包而不是encoding/json
(*)
google.golang.org/protobuf
取代了现在的deprecatedgithub.com/golang/protobuf
及其jsonpb封装。km0tfn4u2#
[更]便携的解决方案:
通过
protoc
生成后,使用sed
剥离标签。我在go中实际使用的例子:在生成 *.pb.go文件后生成脚本:
注意:这里没有使用
sed -i
(inline-replacement),因为该标志不能在标准OS-X和Linux之间移植。jw5wzhpr3#
您可以尝试使用gogo proto(https://github.com/gogo/protobuf)和jsontag扩展,您的proto消息将如下所示
如果愿意,还可以添加更多标签。
webghufk4#
我发现
omitempty
json标记被硬编码到protoc-gen-go源代码的第1778行:这将是很容易改变源代码,使一个新的protoc-gen-go二进制自己。
值得注意的是,这可能是不可取的,出于几个原因不推荐,特别是因为如果需要重新生成protobufs,您将负责确保被破解的二进制文件 * 总是 * 得到使用。
nzk0hqpo5#
我发布了一个更新的Deesilence的答案,与最新的protobuf版本(在写作的时候)。
rqmkfv5c6#
jsonpb包下的封送拆收器有一个EmitDefaults字段。将其设置为true,将忽略struct中的omitempty标记。
https://godoc.org/github.com/golang/protobuf/jsonpb#JSONPBMarshaler
af7jpaap7#
您可以使用“sed”命令从如下文件中删除此文本
其中args:
-i ""
表示保持文件的相同名称-e "s/,omitempty//g"
=要替换的格式,如"s/SEARCH/INSERT/g"
qco9c6ql8#
可以将encoding/json包复制到自己的文件夹中,例如my_json,并将omitEmpty字段修改为false,使用
my_json.Marshal()
将struct编码为json string。