如何让Go Ent生成代码时不添加json:"omitempty"结构体标签
解决Go Ent自动给字段添加
omitempty标签的批量处理方案 方法一:自定义工具函数简化字段设置
创建通用函数统一处理字段的JSON标签,避免重复编写StructTag逻辑:
// ent/schema/utils.go package schema import "entgo.io/ent/schema/field" // NoOmitEmpty 给字段设置不带omitempty的JSON标签 func NoOmitEmpty(f field.Field) field.Field { return f.StructTag(`json:"` + f.Name() + `"`) }
在Schema的字段定义中调用该函数即可:
// ent/schema/user.go func (User) Fields() []ent.Field { return []ent.Field{ field.String("name").Apply(NoOmitEmpty), field.Int("money").Apply(NoOmitEmpty), } }
方法二:代码生成扩展批量移除omitempty
通过自定义Ent代码生成扩展,在代码生成阶段自动移除所有字段JSON标签中的omitempty,无需逐个修改Schema:
- 新建
ent/entc.go文件:
package ent import ( "entgo.io/ent/entc" "entgo.io/ent/entc/gen" "strings" ) type noOmitEmptyExtension struct{} func (noOmitEmptyExtension) Hooks() []gen.Hook { return []gen.Hook{ func(next gen.Generator) gen.Generator { return gen.GenerateFunc(func(g *gen.Graph) error { for _, node := range g.Nodes { for _, field := range node.Fields { // 可选:保留ID字段的默认omitempty标签,跳过处理 if field.Name == "id" { continue } if field.StructTag == "" { continue } // 移除标签中的omitempty关键字 newTag := strings.ReplaceAll(field.StructTag, ",omitempty", "") newTag = strings.TrimSuffix(newTag, "omitempty") field.StructTag = newTag } } return next.Generate(g) }) }, } } func Generate() { entc.Generate("./schema", &gen.Config{}, entc.Extensions(&noOmitEmptyExtension{})) }
- 修改
ent/generate.go的生成指令:
package ent //go:generate go run entc.go
- 执行生成命令:
go generate ./ent
生成后的结构体字段JSON标签会自动移除omitempty,比如Money字段的标签变为json:"money",0值能正常出现在HTTP响应体中。
注意事项
- 若需保留特定字段的
omitempty,可在方法二的钩子中添加字段名判断,跳过对应字段的处理。 - 该方案要求Ent版本在v0.10及以上(代码扩展功能从该版本开始支持)。
内容的提问来源于stack exchange,提问作者Ellisein
相关产品推荐
相关产品推荐

