protobuf3的坑

发布于 2022-09-07 22:44:34 字数 422 浏览 21 评论 0

问题描述

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

狼亦尘 2022-09-14 22:44:34

有更好的解决办法的。
proto生成的文件还是最好不要去修改它,存在即为合理。
可以去看看一下这个。

var pbMarshaler jsonpb.Marshaler

func init() {
    pbMarshaler = jsonpb.Marshaler{
        EmitDefaults: true,
        OrigName:     true,
        EnumsAsInts:  true,
    }
}

有Marshal方法 可以把pb对象读到buffer,剩下的就是 buffer.Bytes()了。
这种方式很方便的,建议使用。

肩上的翅膀 2022-09-14 22:44:34
type Req struct {
    Type       int32  `protobuf:"varint,5,opt,name=type" json:"type,omitempty"`
}

删掉生成的 pb.go 文件的 omitempty

type Req struct {
    Type       int32  `protobuf:"varint,5,opt,name=type" json:"type"`
}

这样就OK了

时光瘦了 2022-09-14 22:44:34

不能直接在 proto协议定义文件中达成么

偏闹i 2022-09-14 22:44:34

一句话搞定你的问题。

 Google.Protobuf.JsonFormatter.Settings.Default.WithFormatDefaultValues(true);

里面的值false或者true是代表了是否为默认值生成序列化字符串,默认是不生成

浅沫记忆 2022-09-14 22:44:34

18年的问题,但是看到了还是简单回答下。因为protoc生成代码会给json tag加上omitempty所以出现这个问题,所以我们使用protoc-go-inject-tag

安装

go get -u github.com/favadi/protoc-go-inject-tag

使用

message UserInfo{
    // @inject_tag: json:"is_auth"
    bool IsAuth = 1;
    // @inject_tag: json:"name"
    string Name = 2;
}

使用protoc生成pb文件

protoc --go_out=. user.proto

运行protoc-go-inject-tag

protoc-go-inject-tag -input=./user.pb.go

同理,如果要改其他tag也可以使用。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文