一、JSON 渲染介绍
在 Gin Web 开发中,前后端交互最常返回 JSON 格式数据,这个过程称为JSON 渲染 。 核心 API:c.JSON(http状态码, 返回的数据)
二、方法 1:map 方式返回 JSON
原生使用map[string]interface{}构造数据
Go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/json", func(c *gin.Context) {
//原生map构造json数据
data := map[string]interface{}{
"name": "小王子",
"message": "hello world!",
"age": 18,
}
c.JSON(http.StatusOK, data)
})
r.Run(":9090")
}
gin.H 快捷写法(推荐)
gin.H本质就是map[string]interface{},省去手写 map 类型,代码更简洁
Go
data := gin.H{
"name": "小王子",
"message": "hello world!",
"age": 18,
}
c.JSON(http.StatusOK, data)
三、方法 2:结构体方式返回 JSON
核心原理
结构体返回 JSON 本质是JSON 序列化,gin 利用反射读取结构体字段。
⚠️ 硬性规则:结构体字段名首字母必须大写,小写为私有字段,反射读取不到,JSON 不会输出该字段。
基础示例
Go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
//定义结构体类型,type关键字
type Msg struct {
Name string
Message string
Age int
}
func main() {
r := gin.Default()
r.GET("/another_json", func(c *gin.Context) {
data := Msg{
Name: "小王子",
Message: "Hello golang!",
Age: 18,
}
c.JSON(http.StatusOK, data)
})
r.Run(":9090")
}
运行后返回结果键名大写:
{"Name":"小王子","Message":"Hello golang!","Age":18}
结构体 Tag 标签定制 JSON 键名
如果想要返回小写 key ,给字段添加json标签,自定义输出名称。
Go
type Msg struct {
Name string `json:"name"`
Message string `json:"message"`
Age int `json:"age"`
}
添加标签后返回结果:
{"name":"小王子","message":"Hello golang!","age":18}
四、两种方式对比总结
- gin.H / map:适合数据少、结构灵活、字段不固定的场景
- 结构体:适合数据字段固定,项目大、规范严格的场景,代码可读性更高
五、高频易错点
- 结构体忘记使用
type定义类型,错写成var msg struct{} - 结构体字段首字母小写,JSON 返回缺失字段
- 忘记调用
c.JSON(),路由没有返回任何响应
访问测试地址
Go
http://127.0.0.1:9090/json
http://127.0.0.1:9090/another_json