如何使用JEN包将字段添加到Golang结构体中,其中字段依赖于JSON?

huangapple go评论89阅读模式
英文:

How to Add a field to struct golang using JEN package where fields depend on JSON

问题

循环遍历 JSON 并获取带有标签的 "name" 字段,然后将其添加到结构块中。

代码生成后的所需输出:

var queryOutput [][]struct {
	product_name string `db:"product_name" json:"product_name"`
	category     string `db:"category" json:"category"`
	category2    string `db:"category2" json:"category2"`
}
for _, yaxis := range YAxisColumn {
	columns := yaxis.(map[string]interface{})
	columnName := columns["name"].(string)
	c := jen.Id(utils.GetFormattedName(columnName)).Int().Tag(map[string]string{
		"json": GetFormattedName(columnName),
		"db":   GetFormattedName(columnName),
	})
}

要添加 Y 轴列字段(即 name)的结构体:

return jen.Func().Id(serviceName).Params().Parens(
	jen.List(jen.Interface(), jen.Error()),
).Block(
	jen.Var().Id("queryOutput").Op("[][]").Struct(
		jen.Id(utils.GetFormattedName(XAxisColumn)).String().Tag(map[string]string{
			"json": utils.GetFormattedName(XAxisColumn),
			"db":   utils.GetFormattedName(XAxisColumn),
		}),
	),
)

JSON 数据:

"yAxisColumn": [
	{
		"name": "category",
		"color": ""
	},
	{
		"name": "category2",
		"color": ""
	}
]
英文:

Looping through the Json and getting the "name" field with tags and then adding it into a block of struct.
Required output after code generation

var queryOutput [][]struct {
		product_name string `db:"product_name" json:"product_name"`
		category     string `db:"category" json:"category"`
		category2    string `db:"category2" json:"category2"`
	}
for _, yaxis := range YAxisColumn {
		columns := yaxis.(map[string]interface{})
		columnName := columns["name"].(string)
		c:= jen.Id(utils.GetFormattedName(columnName)).Int().Tag(map[string]string{
			"json": GetFormattedName(columnName),
			"db":   GetFormattedName(columnName),
		}),
	}

Struct in which to add the Yaxis columns fields i.e name

return jen.Func().Id(serviceName).Params().Parens(
		jen.List(jen.Interface(), jen.Error()),
	).Block(
		jen.Var().Id("queryOutput").Op("[][]").Struct(
			jen.Id(utils.GetFormattedName(XAxisColumn)).String().Tag(map[string]string{
				"json": utils.GetFormattedName(XAxisColumn),
				"db":   utils.GetFormattedName(XAxisColumn),
			}),
),

JSON

"yAxisColumn" : [
                            {
                                "name": "category",
                                "color": ""
                            },
                            {
                                "name": "category2",
                                 "color":""
                            }
],

答案1

得分: 1

在jen包中使用名为StructFunc的函数。

使用后的输出为:

jen.Var().Id("queryOutput").Op("[]").StructFunc(
	func(g *jen.Group) {
		g.Add(jen.Id(utils.GetCamelCaseName(XAxisColumn)).String().Tag(map[string]string{
			"json": utils.GetFormattedName(XAxisColumn),
			"db":   utils.GetFormattedName(XAxisColumn),
		}))
		for _, yaxis := range YAxisColumn {
			columns := yaxis.(map[string]interface{})
			columnName := columns["name"].(string)
			c := jen.Id(utils.GetCamelCaseName(columnName)).Int().Tag(map[string]string{
				"json": utils.GetFormattedName(columnName),
				"db":   utils.GetFormattedName(columnName),
			})
			g.Add(c)
		}
	},
)
英文:

Use a function named as StructFunc in jen package.

Output after using

jen.Var().Id("queryOutput").Op("[]").StructFunc(
			func(g *jen.Group) {
				g.Add(jen.Id(utils.GetCamelCaseName(XAxisColumn)).String().Tag(map[string]string{
					"json": utils.GetFormattedName(XAxisColumn),
					"db":   utils.GetFormattedName(XAxisColumn),
				}))
				for _, yaxis := range YAxisColumn {
					columns := yaxis.(map[string]interface{})
					columnName := columns["name"].(string)
					c := jen.Id(utils.GetCamelCaseName(columnName)).Int().Tag(map[string]string{
						"json": utils.GetFormattedName(columnName),
						"db":   utils.GetFormattedName(columnName),
					})
					g.Add(c)
				}
			},
		),

huangapple
  • 本文由 发表于 2022年9月26日 22:25:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/73855594.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定