protobuf中的omitempty字段处理

protobuf中的omitempty字段处理
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

问题描述

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")
}


本文来源MrKorbin,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/25229

发表评论