protobuf中如何设置jsontag

在使用 protoc-gen-go生成代码的时候,我们在json tag是一个困扰项,因为它不支持设置json tag,这会比较麻烦。比如如下定义

message BaseField {
  string errMsg = 1;
  int64 errCode = 2;
}

最终会生成

type BaseField struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	ErrMsg  string `protobuf:"bytes,1,opt,name=errMsg,proto3" json:"errMsg,omitempty"`
	ErrCode int64  `protobuf:"varint,2,opt,name=errCode,proto3" json:"errCode,omitempty"`
}

默认就是跟 message 定义的一样,且带了 omitempty,这会使返回的结果难以预测,因为omitempty会删掉默认值的字段,比如

BaseField {
	ErrMsg: "", 
	ErrCode: 500,
}

最终 json encode 之后是 {errCode: 500},这个很不好。

当然,protobuf是提供了json_name选项,效果是

message BaseField {
  string errMsg = 1 [json_name = "err_msg"];
  int64 errCode = 2 [json_name = "err_code"];
}
type BaseField struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	ErrMsg  string `protobuf:"bytes,1,opt,name=errMsg,json=err_msg,proto3" json:"errMsg,omitempty"`
	ErrCode int64  `protobuf:"varint,2,opt,name=errCode,json=err_code,proto3" json:"errCode,omitempty"`
}

很明显它只是改变了 protobof里面的 json,而不是外面的。

那么该怎么解决呢,我们可以使用包 github.com/favadi/protoc-go-inject-tag来解决这个问题,其实就是能够替换掉 json tag 就行。

go install github.com/favadi/protoc-go-inject-tag@latest

message BaseField {
  // @inject_tag: json:"err_msg"
  string errMsg = 1;
  
  // @inject_tag: json:"err_code"
  int64 errCode = 2;
}

执行如下命令

protoc read6.proto --go_out=. --go-grpc_out=.

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

最终生成

type BaseField struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// @inject_tag: json:"err_msg"
	ErrMsg string `protobuf:"bytes,1,opt,name=errMsg,proto3" json:"err_msg"`
	// @inject_tag: json:"err_code"
	ErrCode int64 `protobuf:"varint,2,opt,name=errCode,proto3" json:"err_code"`
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值