登录
首页 >  Golang >  Go问答

区分Json解析和gin中的Json绑定

来源:stackoverflow

时间:2024-02-19 22:54:25 121浏览 收藏

大家好,我们又见面了啊~本文《区分Json解析和gin中的Json绑定》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

嗨,我是 gin 框架和 golang 的新手,我想知道 json.unmarshal() 和 gin.bindjson() 之间有什么区别

在本教程中,他正在构建一个视频服务,该服务有两种方法:保存和查找所有

func (vc *videoControllerStruct) Save(ctx *gin.Context) entity.Video {
    video := entity.Video{}
    ctx.ShouldBind(&video) // ctx.BindJson(&video)
    vc.services.Save(video)
    return video

如你所见,他首先使用了 ctx.bindjson,然后将其更改为 shouldbind(不知道为什么) 有没有办法用 json.unmarshal 重写这段代码?


正确答案


json.unmarshal 和 gin.bindjson 之间的主要区别是:

  • json.unmarshal 对原始 json 数据进行操作,而 gin.bindjson 则进行绑定 从请求正文到结构。
  • json.unmarshal 需要手动获取 json 数据([]byte), 而 gin.bindjson 处理从请求获取 json 数据 透明。
  • gin.bindjson 可以进行额外的验证和绑定,而 json.unmarshal 只是解组原始 json。

要将 json.unmarshal 与 gin 一起使用,您必须执行以下操作:

func (vc *videocontroller) save(ctx *gin.context) {

  // get json data 
  var jsondata []byte
  if ctx.request.body != nil {
    jsondata, _ = ioutil.readall(ctx.request.body)
  }

  // declare video struct
  var video entity.video

  // unmarshal into struct
  err := json.unmarshal(jsondata, &video)
  if err != nil {
    // handle error
  }

  // save video 
  vc.services.save(video)

  // return saved video
  return video

}

shouldbind 看起来像这样:

func (c *Context) ShouldBind(obj any) error {
    b := binding.Default(c.Request.Method, c.ContentType())
    return c.ShouldBindWith(obj, b)
}

它主要检查请求方法和内容类型,并基于此解析绑定。因此,传入的内容可以是 json 之外的其他内容。

bindjson 只是 mustbindwith(obj, binding.json) 的别名,它严格尝试将请求正文解组为 json。传递任何其他内容都会产生 400 http 状态。

您还可以使用 json.unmarshal,但您必须在 gin 上下文中显式访问请求正文。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>