
本文详解 go 语言中构建含数组和映射结构的 json 数据的正确方式,指出常见类型定义与字段导出问题,并提供可运行的完整示例。
本文详解 go 语言中构建含数组和映射结构的 json 数据的正确方式,指出常见类型定义与字段导出问题,并提供可运行的完整示例。
在 Go 中生成合法、可序列化的 JSON,关键在于两点:字段必须可导出(首字母大写),且类型需被 encoding/json 包原生支持或实现 json.Marshaler 接口。原始代码存在多个根本性错误,导致编译失败且无法输出预期 JSON:
-
未导出字段:
Veggies和array字段均为小写开头,json.Marshal会忽略它们(Go 的反射机制无法访问非导出字段); -
非法类型别名:
type array map[string][]int定义了自定义类型array,但其字段名array在结构体中仍为小写,且该类型未导出; -
语法错误:
vegetables["Carrots"] = 21中Vegetables{}是值类型而非映射,应声明为map[string]int;n["array"] = ...也因n类型不匹配而报错; -
命名冲突风险:使用
array作为类型名易与语言概念混淆,且不符合 Go 命名惯例(推荐IntSlice或直接用[]int)。
✅ 正确做法是:使用导出字段 + 标准类型组合。以下为可直接运行的修复版代码:
package main
import (
"encoding/json"
"fmt"
)
type Data struct {
Veggies map[string]int `json:"veggies"` // 导出字段,可序列化;tag 控制 JSON 键名
Ints []int `json:"ints"` // 切片即 JSON 数组
}
func main() {
// 初始化映射
vegetables := make(map[string]int)
vegetables["Carrots"] = 21
vegetables["Lettuce"] = 15
// 构造数据
d := Data{
Veggies: vegetables,
Ints: []int{1, 1, 1},
}
// 序列化为格式化 JSON
b, err := json.MarshalIndent(d, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(b))
}
输出结果:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
{
"veggies": {
"Carrots": 21,
"Lettuce": 15
},
"ints": [1, 1, 1]
}
? 关键注意事项:
- 所有需 JSON 序列化的结构体字段必须首字母大写(如
Veggies而非veggies); - 使用
json:"key"tag 可自定义 JSON 中的字段名,增强可读性与兼容性; - 避免嵌套自定义类型(如
type array map[string][]int),除非有明确封装需求——多数场景直接使用map[string]int和[]int更清晰、安全; - 始终检查
json.Marshal的返回错误,生产环境不可忽略; - 深入理解 JSON 包文档 和 Go 编程语言规范 是写出健壮序列化逻辑的基础。
通过遵循导出规则、选用标准类型并合理使用结构体标签,即可高效、可靠地生成符合预期的 JSON 输出。










