1. JSON 请求数据解析
在 Gin 中,可以通过 c.ShouldBindJSON
方法解析客户端发送的 JSON 数据,并将其绑定到结构体中。
示例:解析 JSON 请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package main
import ( "github.com/gin-gonic/gin" )
type Login struct { Username string `json:"username"` Password string `json:"password"` }
func main() { r := gin.Default()
r.POST("/login", func(c *gin.Context) { var login Login
if err := c.ShouldBindJSON(&login); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return }
c.JSON(200, gin.H{ "username": login.Username, "status": "Login successful", }) })
r.Run(":8080") }
|
注意事项
- 使用
ShouldBindJSON
时,确保 Content-Type
为 application/json
。
- 结构体中的字段需要添加
json
标签,指明字段名称。
2. JSON 响应
Gin 提供了方便的方法来返回 JSON 数据,例如 c.JSON
。
示例:返回 JSON 响应
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package main
import ( "github.com/gin-gonic/gin" )
func main() { r := gin.Default()
r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) })
r.Run(":8080") }
|
使用结构体返回 JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package main
import ( "github.com/gin-gonic/gin" )
type User struct { ID int `json:"id"` Username string `json:"username"` }
func main() { r := gin.Default()
r.GET("/user", func(c *gin.Context) { user := User{ ID: 1, Username: "john_doe", } c.JSON(200, user) })
r.Run(":8080") }
|
3. 自定义响应格式
通过定义结构体,可以定制统一的响应格式,提升代码的一致性和可维护性。
示例:统一的响应格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package main
import ( "github.com/gin-gonic/gin" )
type Response struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data"` }
func main() { r := gin.Default()
r.GET("/data", func(c *gin.Context) { response := Response{ Code: 200, Message: "Success", Data: gin.H{ "item": "value", }, } c.JSON(200, response) })
r.Run(":8080") }
|
4. 处理 JSON 数组
Gin 支持返回 JSON 数组,可以直接用切片或数组表示数据。
示例:返回 JSON 数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package main
import ( "github.com/gin-gonic/gin" )
func main() { r := gin.Default()
r.GET("/list", func(c *gin.Context) { data := []string{"item1", "item2", "item3"} c.JSON(200, gin.H{"items": data}) })
r.Run(":8080") }
|
5. 错误处理中的 JSON 响应
在处理错误时,也可以通过 JSON 格式返回错误信息,提升 API 的一致性。
示例:返回 JSON 格式的错误信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package main
import ( "github.com/gin-gonic/gin" )
func main() { r := gin.Default()
r.GET("/error", func(c *gin.Context) { c.JSON(400, gin.H{ "error": "Invalid request", "details": "Missing required parameters", }) })
r.Run(":8080") }
|
6. 总结
Gin 提供了强大的 JSON 数据处理能力:
- 解析 JSON 请求:通过
ShouldBindJSON
将请求数据绑定到结构体。
- 返回 JSON 响应:使用
c.JSON
,支持直接返回结构体、切片等数据。
- 自定义响应格式:定义统一的结构体,确保 API 的一致性。
- 错误信息格式化:通过 JSON 格式返回清晰的错误描述。