
在 Gin 中使用 c.JSON() 返回结构体切片时,需确保字段首字母大写(导出)且 JSON 标签正确,否则如 id(小写)等字段将被忽略——这是 Go 的反射机制导致的常见问题。
在 gin 中使用 `c.json()` 返回结构体切片时,需确保字段首字母大写(导出)且 json 标签正确,否则如 `id`(小写)等字段将被忽略——这是 go 的反射机制导致的常见问题。
在 Go 语言中,只有首字母大写的导出字段才能被 json.Marshal 序列化。你定义的结构体中 id、Name 和 Status 字段看似已打标签,但关键问题在于:id 是小写字母开头(id int64),属于未导出字段,因此 json 包完全无法访问它,无论 json:"id" 标签是否存在——该标签会被静默忽略。
✅ 正确写法(字段必须导出):
type MyStruct struct {
ID int64 `db:"id" json:"id"` // ✅ 首字母大写,可导出
Name string `form:"name" db:"name" json:"name" binding:"required"`
Status string `form:"status" db:"status" json:"status" binding:"required"`
}⚠️ 注意事项:
- Go 的 JSON 序列化不依赖字段名大小写,而依赖是否导出(即首字母是否为大写);
- json:"id" 标签仅控制序列化后的键名,不能绕过导出规则;
- int64 类型本身完全支持 JSON 序列化(Gin 底层使用 encoding/json),无需特殊处理;
- 若数据库查询使用 sqlx.StructScan 或类似工具,请确保扫描目标字段与结构体导出字段一一对应。
完整 Gin 示例:
func GetItems(c *gin.Context) {
var myArray []MyStruct
// 例如:从数据库查询填充 myArray...
// err := db.Select(&myArray, "SELECT id, name, status FROM items")
c.JSON(http.StatusOK, myArray) // ✅ 自动序列化为标准 JSON 数组
}预期响应(HTTP 200):
[
{
"id": 1,
"name": "abc",
"status": "default"
},
{
"id": 2,
"name": "xyz",
"status": "default"
}
]? 总结:
Gin 的 c.JSON() 调用本身无问题,核心陷阱在于 Go 的导出规则。务必检查结构体字段命名——全部使用 PascalCase(如 ID, Name, Status),并配以恰当的 json 标签。调试时可用 json.Marshal(myArray) 手动测试序列化结果,快速验证字段可见性。


















