首页 > 解决方案 > 具有嵌套负载的 JSON 绑定

问题描述

我正在使用 Go 和 Buffalo 开发 API。接收请求时,可以自动将 JSON 有效负载映射到结构:

func MyAction(c buffalo.Context) error {
  u := &User{}
  if err := c.Bind(u); err != nil {
    return err
  }
  u.Name // "Ringo"
  u.Email // "ringo@beatles.com"
} 

但是,它假设有效载荷是这种形状:

{
  "name": "Ringo",
  "email": "ringo@beatles.com"
}

如果由于某种原因,传入的有效负载有一个键:

{
 "user": {
    "name": "Ringo",
    "email": "ringo@beatles.com"
  } 
}

绑定不起作用。我找不到如何处理这种情况。我应该如何处理这个?

标签: gobuffalo

解决方案


也许你可以用 包装你的结构map[string]User{},这里有一个例子:

func MyAction(c buffalo.Context) error {
  u := map[string]User{
    "user": User{},
  }
  if err := c.Bind(&u); err != nil {
    return err
  }
  user := u["user"]
  user.Name // "Ringo"
  user.Email // "ringo@beatles.com"
} 

在我看来,定义一个结构将是更清洁的解决方案:

type UserObject struct {
    User struct {
        Email string
        Name  string
    }
}

func MyAction(c buffalo.Context) error {
   u := UserObject{}
   if err := c.Bind(&u); err != nil {
      return err
   }
   user := u.User
   user.Name // "Ringo"
   user.Email // "ringo@beatles.com"
} 

推荐阅读