本文详解如何使用 go 的 `encoding/json` 包安全解析含 `null` 元素的 json 数组,通过自定义结构体与指针接收实现灵活字段提取,并避免因 `null` 导致的解码失败。
Go 语言原生的 json.Unmarshal 对 null 值有明确行为:当目标类型为非指针结构体时,null 会导致解码错误;但若使用*指向结构体的指针切片(`[]Item)**,null会被自动映射为nil`,从而安全跳过——这正是处理混合数据(如部分对象缺失、部分含可选字段)的关键技巧。
以下是一个完整、
健壮的解析示例:
package main
import (
"encoding/json"
"fmt"
)
type Item struct {
Id int `json:"id"`
Label string `json:"label,omitempty"`
}
func main() {
data := []byte(`[
{"id": 27},
{"id": 0, "label": "Label 0"},
null,
{"id": 93},
{"id": 85},
{"id": 54},
null,
{"id": 46, "label": "Label 46"}
]`)
var items []*Item
if err := json.Unmarshal(data, &items); err != nil {
fmt.Printf("JSON 解析失败: %v\n", err)
return
}
fmt.Println("解析结果(共", len(items), "项):")
for i, item := range items {
if item == nil {
fmt.Printf("[%d] → nil (原始 JSON 中的 null)\n", i)
} else {
fmt.Printf("[%d] id=%d, label=%q\n", i, item.Id, item.Label)
}
}
}✅ 关键要点说明:
⚠️ 注意事项:
掌握这一模式后,你可轻松扩展支持更深层嵌套(如 "metadata": {"version": 1, "tags": ["a","b"]}),只需在 Item 中嵌入对应结构体并正确设置 JSON 标签即可。