protobuf中的omitempty字段处理

问题描述

proto文件自动生成.pb.go文件的代码中tag上会自动加上omitempty字段,如下:

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

	Id        string       `protobuf:"bytes,1,opt,name=id,proto3" json:"id" bson:"id" form:"id"`
	RoleId    string       `protobuf:"bytes,2,opt,name=role_id,json=roleId,proto3" json:"role_id" bson:"role_id" form:"role_id"`
	UserId    string       `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id" bson:"user_id" form:"user_id"`
	Type      RoleUserType `protobuf:"varint,4,opt,name=type,proto3,enum=roleUser.RoleUserType" json:"type" bson:"type" form:"type"`
	StartedAt int64        `protobuf:"varint,6,opt,name=started_at,json=startedAt,proto3" json:"started_at" bson:"started_at" form:"started_at"`
	ExpiredAt int64        `protobuf:"varint,7,opt,name=expired_at,json=expiredAt,proto3" json:"expired_at" bson:"expired_at" form:"expired_at"`
	CreatedAt int64        `protobuf:"varint,100,opt,name=created_at,json=createdAt,proto3" json:"created_at" bson:"created_at" form:"created_at"`
	UpdatedAt int64        `protobuf:"varint,101,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at" bson:"updated_at" form:"updated_at"`
	DeletedAt int64        `protobuf:"varint,102,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at" bson:"deleted_at" form:"deleted_at"`
}

这个字段会导致一个问题是:带有omitempty tag的成员,如果该字段为零值,则在序列化为JSON后不会带有该字段,如果前端需要显示零值,则会找不到字段而报错。

处理方法

同样用go写个简单脚本,批量删除该tag:

//remove_tag_test.go

package pb

import (
	"fmt"
	"io/ioutil"
	"strings"
	"testing"
)

const filename = "./roleUser.pb.go"

func TestRemoveTag(t *testing.T) {
	fileData, err := ioutil.ReadFile(filename)
	if err != nil {
		fmt.Printf("ReadFile err: %v\n", err)
		return
	}
	data := strings.ReplaceAll(string(fileData), ",omitempty", "")
	fileData = []byte(data)
	err = ioutil.WriteFile(filename, fileData, 0644)
	if err != nil {
		fmt.Printf("WriteFile err: %v\n", err)
		return
	}
	fmt.Println("TestRemoveTag successfully")
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值