protobuf3的坑
问题描述
protobuf由2升到3之后有个很烦人的坑:
当我返回的值是默认值时,protobuf会自动帮我忽略这个字段
相关代码
message UserInfo{
bool IsAuth = 1;
string Name = 2;
}
如果IsAuth是false的时候返回的就是{"Name":"xxxx"}
如果IsAuth是true时,返回的是{"IsAuth":true,"Name":"xxxxx"}
类似的问题还有很多int32=0,string=""的时候都会忽略字段
问题来了
我们跟前端的交互用的是jsonrpc,这个丢失的字段让前端处理起来不是很友好,不知道有没有什么办法解决这种问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
有更好的解决办法的。
proto生成的文件还是最好不要去修改它,存在即为合理。
可以去看看一下这个。
有Marshal方法 可以把pb对象读到buffer,剩下的就是 buffer.Bytes()了。
这种方式很方便的,建议使用。
删掉生成的 pb.go 文件的 omitempty
这样就OK了
不能直接在 proto协议定义文件中达成么
一句话搞定你的问题。
里面的值false或者true是代表了是否为默认值生成序列化字符串,默认是不生成
18年的问题,但是看到了还是简单回答下。因为
protoc
生成代码会给json tag
加上omitempty
所以出现这个问题,所以我们使用protoc-go-inject-tag
。安装
使用
使用
protoc
生成pb文件运行
protoc-go-inject-tag
同理,如果要改其他tag也可以使用。