Gin 中 c.BindJSON与 c.JSON的实现示例

 更新时间:2026年11月13日 09:45:27   作者:会编程的土豆  
本文主要介绍了Gin 中 c.BindJSON与 c.JSON的实现示例,用通俗比喻和代码示例带你搞懂JSON解析、结构体绑定和响应返回的全过程,感兴趣的可以了解一下

在 Gin 中,c.BindJSON 和 c.JSON 是前后端交互的两个核心操作,它们构成了数据从前端到后端再返回前端的完整链路。

1.c.BindJSON:接收前端数据

假设前端发送 POST 请求:

{"title":"学Gin","status":false}

后端代码:

var body struct {
    Title  string `json:"title"`
    Status bool   `json:"status"`
}
c.BindJSON(&body)

赋值过程详解:

  1. 读取 Body

    • Gin 从 HTTP 请求中获取请求 Body。
    • Body 是原始 JSON 数据:{"title":"学Gin","status":false}
  2. 解析 JSON

    • Gin 调用 Go 标准库 encoding/json 对 JSON 进行解析。
  3. 结构体字段匹配

    • 标签 json:"title" 对应 Go 的 Title
    • 标签 json:"status" 对应 Go 的 Status
  4. 填充值

    • "title":"学Gin" → body.Title = "学Gin"
    • "status":false → body.Status = false

此时,结构体 body 中的数据已经完全对应前端发送的数据。

fmt.Println(body.Title)  // 输出: 学Gin
fmt.Println(body.Status) // 输出: false

总结:c.BindJSON 的作用是“拆包 + 填字段”,把前端 JSON 数据装入 Go 结构体中,方便后续业务逻辑使用。

2.c.JSON:返回数据给前端

处理完数据后,后端需要把结果返回给前端,常用方法是 c.JSON。

c.JSON(200, gin.H{
    "message": "创建成功",
    "todo":    body,
})

执行过程:

  1. 接收 Go 对象

    • gin.H 是 map[string]interface{} 的简写,用于快速构造 JSON 数据
    • 结构体 body 也可以直接返回
  2. 序列化 JSON

    • Gin 内部使用 encoding/json.Marshal 将 Go 对象转换成 JSON 字符串
    • 结构体标签 json:"..." 决定了 JSON 字段名
      • Title → "title"
      • Status → "status"
  3. 返回 HTTP 响应

    • 状态码 200
    • 响应 Body 为 JSON 字符串:
{
  "message": "创建成功",
  "todo": {
    "title": "学Gin",
    "status": false
  }
}

总结:c.JSON 的作用是“打包 + 发快递”,把 Go 对象转换成 JSON 返回给前端。

3. 前后端完整交互流程

前端 JSON.stringify → 发 POST 请求
        ↓
Gin c.BindJSON → 装进结构体
        ↓
业务逻辑处理
        ↓
Gin c.JSON → 转 JSON → 返回前端
        ↓
前端 JSON.parse → 更新页面

示例代码:

type Todo struct {
    Title  string `json:"title"`
    Status bool   `json:"status"`
}

r.POST("/todos", func(c *gin.Context) {
    var body Todo
    if err := c.BindJSON(&body); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }

    // 假设保存数据库成功
    c.JSON(200, gin.H{
        "message": "创建成功",
        "todo":    body,
    })
})

4. 总结

方法作用数据方向
c.BindJSON(&struct)接收前端 JSON,填入 Go 结构体前端 → 后端
c.JSON(status, obj)将 Go 对象转换成 JSON,返回前端后端 → 前端

结合使用 c.BindJSON + c.JSON,就完成了前后端的数据闭环,实现了完整的请求处理和响应返回。

到此这篇关于Gin 中 c.BindJSON与 c.JSON的实现示例的文章就介绍到这了,更多相关Gin c.BindJSON与 c.JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于go interface{}==nil 的几种坑及原理分析

    基于go interface{}==nil 的几种坑及原理分析

    这篇文章主要介绍了基于go interface{}==nil 的几种坑及原理分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang集成FFmpeg的音视频处理的实现

    Golang集成FFmpeg的音视频处理的实现

    FFmpeg是一个开源的音视频处理工具,广泛用于视频转换、截图、处理和流媒体推送等操作,本文主要介绍了Golang集成FFmpeg的音视频处理的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Go语言结构体定义和使用方法

    Go语言结构体定义和使用方法

    这篇文章主要介绍了Go语言结构体定义和使用方法,以实例形式分析了Go语言中结构体的定义和使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • goframe重写FastAdmin后端实现实例详解

    goframe重写FastAdmin后端实现实例详解

    这篇文章主要为大家介绍了goframe重写FastAdmin后端实现实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • go rate 原生标准限速库的使用

    go rate 原生标准限速库的使用

    本文主要介绍了Go标准库golang.org/x/time/rate实现限流,采用令牌桶算法控制请求速率,提供Allow/Reserve/Wait方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-05-05
  • 一文介绍Go语言中的指针

    一文介绍Go语言中的指针

    指针是一个存储变量内存地址的变量,本文主要介绍了Go语言中的指针,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 浅谈Go切片的值修改是否会覆盖数组的值 

    浅谈Go切片的值修改是否会覆盖数组的值 

    本文主要介绍了浅谈Go切片的值修改是否会覆盖数组的值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 
    2022-02-02
  • golang协程关闭踩坑实战记录

    golang协程关闭踩坑实战记录

    协程(coroutine)是Go语言中的轻量级线程实现,下面这篇文章主要给大家介绍了关于golang协程关闭踩坑的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • golang中cache组件的使用及groupcache源码解析

    golang中cache组件的使用及groupcache源码解析

    本篇主要解析groupcache源码中的关键部分, lru的定义以及如何做到同一个key只加载一次。缓存填充以及加载抑制的实现方法,本文重点给大家介绍golang中cache组件的使用及groupcache源码解析,感兴趣的朋友一起看看吧
    2021-06-06
  • Go语言omitempty选项的实现

    Go语言omitempty选项的实现

    本文主要介绍了Go语言omitempty选项的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论