一、背景与作用
在 Go 项目中,经常需要把结构体、map 等数据序列化为 JSON,用于:
打日志(debug)
写文件(配置 / 结果快照)
排查复杂嵌套数据(如告警、监控、Agent 返回)
encoding/json 提供了两种常用方式:
json.Marshal:紧凑 JSON,适合机器传输
json.MarshalIndent:格式化 JSON,适合人阅读
json.MarshalIndent 的核心目标只有一个:让 JSON 更可读,而不改变其语义。
go
func json.MarshalIndent(v any, prefix, indent string) ([]byte, error)
1️⃣ v(待序列化对象)
可以是 struct、map、slice、嵌套组合
行为与 json.Marshal 完全一致
2️⃣ prefix(行前缀)
会加在 每一行的最前面
常见写法:""
偶尔用于日志对齐或嵌入输出
3️⃣ indent(缩进字符串)
每增加一层嵌套,就追加一次
go
data := map[string]any{
"id": 1,
"name": "alert",
"meta": map[string]any{
"state": "alerting",
"count": 3,
},
}
b, err := json.MarshalIndent(data, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(b))
{
"id": 1,
"meta": {
"count": 3,
"state": "alerting"
},
"name": "alert"
}