
json.Decoder 完全支持直接解码顶层 JSON 数组,无需先读取全部字节再调用 json.Unmarshal;只需将目标变量声明为对应结构体的切片并传入地址即可高效流式解析。
`json.decoder` 完全支持直接解码顶层 json 数组,无需先读取全部字节再调用 `json.unmarshal`;只需将目标变量声明为对应结构体的切片并传入地址即可高效流式解析。
在 Go 中,json.Decoder 不仅适用于解析 JSON 对象(如 {"key":"value"}),同样原生支持解析顶层 JSON 数组(如 [{"name":"Alice"},{"name":"Bob"}])。关键在于:*解码目标必须是切片类型的地址(`[]T`)**,而非单个结构体或未取地址的切片变量。
以下是一个完整、可运行的示例:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
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 接口天然契合。只要确保目标变量为结构体切片,并传递其地址,即可安全、高效完成解码。










