【基于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
相关推荐
特立独行的猫A5 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
2分钟速写快排6 小时前
孔乙己的茴字有多少种写法?|AI 对话实时通信的三种实现
前端·javascript·github
码事漫谈8 小时前
我花了一周时间,看AI公司怎么"管"AI,结果越看越后背发凉
后端
Penge6668 小时前
JavaScript:BOM 详解
前端
Penge6668 小时前
Vite vs Webpack:前端构建工具原理与实战
前端
Penge6668 小时前
前端包管理工具:npm、Yarn、pnpm 快速入门
前端
Penge6669 小时前
Sass 了解
前端
Penge6669 小时前
Webpack 打包从 0 到 1 实战笔记
前端
Penge6669 小时前
Webpack 入门:是什么、为什么需要、怎么使用?
前端
Penge66610 小时前
Ant Design(Antd)了解
前端