
json.Decoder 完全支持直接解码顶层 JSON 数组,无需先读取全部字节再调用 json.Unmarshal;只需将目标变量声明为对应结构体的切片并传入地址即可高效流式解析。
`json.decoder` 完全支持直接解码顶层 json 数组,无需先读取全部字节再调用 `json.unmarshal`;只需将目标变量声明为对应结构体的切片并传入地址即可高效流式解析。
在 Go 中,json.Decoder 不仅适用于解析 JSON 对象(如 {"key":"value"}),同样原生支持解析顶层 JSON 数组(如 [{"name":"Alice"},{"name":"Bob"}])。关键在于:*解码目标必须是切片类型的地址(`[]T`)**,而非单个结构体或未取地址的切片变量。
以下是一个完整、可运行的示例:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type Result struct {
Name string `json:"Name"`
Age int `json:"Age"`
OriginalName string `json:"Original_Name"`
}
func main() {
jsonString := `[{"Name":"James","Age":6,"Original_Name":"Jameson"}]`
// ✅ 正确:声明切片并传入其地址
var results []Result
decoder := json.NewDecoder(bytes.NewBufferString(jsonString))
err := decoder.Decode(&results) // 注意 &results
if err != nil {
panic(err)
}
fmt.Printf("Decoded %d item(s): %+v\n", len(results), results)
// 输出:Decoded 1 item(s): [{Name:James Age:6 OriginalName:Jameson}]
}⚠️ 常见错误提醒:
- 若写成 decoder.Decode(results)(未取地址),会触发 json: cannot unmarshal array into Go value of type main.Result 错误;
- 若目标类型为 []*Result,需确保切片元素可被正确初始化(通常推荐 []Result);
- json.Decoder 支持流式读取,对大数组更省内存——例如从 http.Request.Body 或文件直接解码时,无需一次性加载全部 JSON 到内存。
✅ 总结:解析顶层 JSON 数组时,json.Decoder 是首选方案。它语义清晰、性能优越、与标准库 I/O 接口天然契合。只要确保目标变量为结构体切片,并传递其地址,即可安全、高效完成解码。

















