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

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

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

问题

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

代码生成后的所需输出:

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

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

  1. return jen.Func().Id(serviceName).Params().Parens(
  2. jen.List(jen.Interface(), jen.Error()),
  3. ).Block(
  4. jen.Var().Id("queryOutput").Op("[][]").Struct(
  5. jen.Id(utils.GetFormattedName(XAxisColumn)).String().Tag(map[string]string{
  6. "json": utils.GetFormattedName(XAxisColumn),
  7. "db": utils.GetFormattedName(XAxisColumn),
  8. }),
  9. ),
  10. )

JSON 数据:

  1. "yAxisColumn": [
  2. {
  3. "name": "category",
  4. "color": ""
  5. },
  6. {
  7. "name": "category2",
  8. "color": ""
  9. }
  10. ]
英文:

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

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

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

  1. return jen.Func().Id(serviceName).Params().Parens(
  2. jen.List(jen.Interface(), jen.Error()),
  3. ).Block(
  4. jen.Var().Id("queryOutput").Op("[][]").Struct(
  5. jen.Id(utils.GetFormattedName(XAxisColumn)).String().Tag(map[string]string{
  6. "json": utils.GetFormattedName(XAxisColumn),
  7. "db": utils.GetFormattedName(XAxisColumn),
  8. }),
  9. ),

JSON

  1. "yAxisColumn" : [
  2. {
  3. "name": "category",
  4. "color": ""
  5. },
  6. {
  7. "name": "category2",
  8. "color":""
  9. }
  10. ],

答案1

得分: 1

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

使用后的输出为:

  1. jen.Var().Id("queryOutput").Op("[]").StructFunc(
  2. func(g *jen.Group) {
  3. g.Add(jen.Id(utils.GetCamelCaseName(XAxisColumn)).String().Tag(map[string]string{
  4. "json": utils.GetFormattedName(XAxisColumn),
  5. "db": utils.GetFormattedName(XAxisColumn),
  6. }))
  7. for _, yaxis := range YAxisColumn {
  8. columns := yaxis.(map[string]interface{})
  9. columnName := columns["name"].(string)
  10. c := jen.Id(utils.GetCamelCaseName(columnName)).Int().Tag(map[string]string{
  11. "json": utils.GetFormattedName(columnName),
  12. "db": utils.GetFormattedName(columnName),
  13. })
  14. g.Add(c)
  15. }
  16. },
  17. )
英文:

Use a function named as StructFunc in jen package.

Output after using

  1. jen.Var().Id("queryOutput").Op("[]").StructFunc(
  2. func(g *jen.Group) {
  3. g.Add(jen.Id(utils.GetCamelCaseName(XAxisColumn)).String().Tag(map[string]string{
  4. "json": utils.GetFormattedName(XAxisColumn),
  5. "db": utils.GetFormattedName(XAxisColumn),
  6. }))
  7. for _, yaxis := range YAxisColumn {
  8. columns := yaxis.(map[string]interface{})
  9. columnName := columns["name"].(string)
  10. c := jen.Id(utils.GetCamelCaseName(columnName)).Int().Tag(map[string]string{
  11. "json": utils.GetFormattedName(columnName),
  12. "db": utils.GetFormattedName(columnName),
  13. })
  14. g.Add(c)
  15. }
  16. },
  17. ),

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:

确定