具有嵌套有效负载的JSON绑定

时间:2019-07-19 09:08:51

标签: go buffalo

我正在使用Go和Buffalo开发API。 收到请求时,可以automatically map the JSON payload到一个结构:

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

绑定无效。我找不到如何处理这种情况。 我应该如何处理?

1 个答案:

答案 0 :(得分:3)

也许您可以用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"
}