Gin 中 `c.BindJSON` 与 `c.JSON` 详细讲解

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


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

假设前端发送 POST 请求:

json 复制代码
{"title":"学Gin","status":false}

后端代码:

go 复制代码
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":falsebody.Status = false

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

go 复制代码
fmt.Println(body.Title)  // 输出: 学Gin
fmt.Println(body.Status) // 输出: false

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


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

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

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

执行过程:

  1. 接收 Go 对象

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

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

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

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


3. 前后端完整交互流程

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

示例代码:

go 复制代码
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,就完成了前后端的数据闭环,实现了完整的请求处理和响应返回。

相关推荐
晓蛋1 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
傲世仙尊1 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
A黄俊辉A1 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
牵猫散步的鱼儿1 天前
重载、重写(覆盖)、重定义区别
c语言
ttwuai1 天前
Go开源后台管理系统推荐:怎么按技术栈和边界比较4个官方仓库?
golang·gin
phltxy1 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
phltxy1 天前
C 语言中的数据存储:从类型到二进制位
c语言
wuminyu1 天前
HotSpot的轻量锁与膨胀后的ObjectMonitor状态重建原理
java·linux·c语言·jvm·c++
码不停蹄Zzz1 天前
指针用法篇——malloc和free指针详解
c语言