【基于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
相关推荐
小蒜学长1 小时前
基于Django的社区团购购物平台的设计与实现(代码+数据库+LW)
数据库·后端·python·django
IMPYLH1 小时前
HTML 的 <ins> 元素
前端·javascript·html
kymjs张涛1 小时前
DeepSeek Harness源码分析:非 AI 开发者的 Agent 学习总结
前端·后端·面试
Dovis(誓平步青云)1 小时前
番茄钟真正难的不是倒计时:启动、暂停、重置与页面销毁
android·服务器·前端
jj_ccwgw1 小时前
UOS系统 Kafka KRaft 集群安装指南
后端
rannn_1111 小时前
Java 后端面试题总结:点赞功能怎么实现?
java·后端·面试
一千柯橘1 小时前
了解 dev-tools 不同的 debug 模式
前端
晨米酱1 小时前
Umi Mock 如何从文件声明变成 HTTP 响应
前端·javascript·设计
小粉粉hhh1 小时前
记录前端菜鸟的日常——自动打包脚本
前端