【基于GO的Web开发9】gin框架返回json

一、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}

四、两种方式对比总结

  1. gin.H / map:适合数据少、结构灵活、字段不固定的场景
  2. 结构体:适合数据字段固定,项目大、规范严格的场景,代码可读性更高

五、高频易错点

  1. 结构体忘记使用type定义类型,错写成var msg struct{}
  2. 结构体字段首字母小写,JSON 返回缺失字段
  3. 忘记调用c.JSON(),路由没有返回任何响应

访问测试地址

Go 复制代码
http://127.0.0.1:9090/json
http://127.0.0.1:9090/another_json
相关推荐
晚安code2 分钟前
设计模式入门:吃透 SOLID 原则与迪米特法则,再学 5 个高频模式
后端·设计模式
Helix25011 分钟前
Chrome 开发者工具进阶:长截图、网络调试与性能分析
前端·chrome·chrome devtools·使用技巧·性能分析·开发者工具·长截图
liangshanbo121539 分钟前
面试题:Webpack 的 publicPath 有什么作用?
前端·webpack·node.js
mjhcsp40 分钟前
DeepSeek V4.1 Flash 批量处理效能实测
java·前端·数据库
CHEEVEN_QY2 小时前
新能源汽车电池托盘FSW量产的工艺稳定性控制
java·前端·汽车
念何架构之路2 小时前
zap WriteSyncer与Sink体系
云原生·golang
Alice-YUE2 小时前
前端 × AI:从 Cursor 到 Transformer,一份完整认知路径
前端·人工智能·transformer·ai编程·前端开发·cursor
Code_Solitude2 小时前
C语言:关于二维数组的作业总结
java·c语言·前端
专业程序开发源2 小时前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
打工仔折腾 AI3 小时前
把 AI Agent 托管到家里电脑:UU远程端口映射与CLI实测记录
人工智能·后端·python·langchain·电脑·ai agent 实战