
本文详解Go语言中解析含嵌套JSON数组时常见的index out of range运行时错误,指出根本原因是JSON格式与Go结构体定义不匹配,并提供符合JSON规范的正确写法及完整可运行示例。
本文详解go语言中解析含嵌套json数组时常见的`index out of range`运行时错误,指出根本原因是json格式与go结构体定义不匹配,并提供符合json规范的正确写法及完整可运行示例。
在Go中使用encoding/json解析嵌套JSON数组时,一个常见但易被忽视的错误是:将JSON数组元素误写为非对象字面量(如字符串或数字),而结构体字段却期望接收结构体切片。这会导致json.Unmarshal无法完成赋值,目标切片保持nil,后续直接访问slice[0]便会触发panic: runtime error: index out of range。
问题代码中的关键错误在于这一行:
{ "objects": [ "name": "foo" ] }该JSON语法本身即非法——方括号内的"name": "foo"既不是合法JSON对象(缺少外层花括号),也不是有效JSON值(如字符串、数字等)。正确形式必须是包含完整JSON对象的数组:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
{ "objects": [ {"name": "foo"} ] }以下是修复后的完整可运行示例:
package main
import (
"fmt"
"encoding/json"
)
type JSONObject struct {
Objects []ObjectType `json:"objects"`
}
type ObjectType struct {
Name string `json:"name"`
}
func main() {
// ✅ 正确解析单个对象
bytes1 := []byte(`{"name": "foo"}`)
var obj ObjectType
if err := json.Unmarshal(bytes1, &obj); err != nil {
panic(err)
}
fmt.Printf("Single object: %s\n", obj.Name) // 输出: Single object: foo
// ✅ 正确解析含数组的对象(注意:数组元素必须是JSON对象)
bytes2 := []byte(`{"objects": [{"name": "foo"}, {"name": "bar"}]}`)
var jsonObj JSONObject
if err := json.Unmarshal(bytes2, &jsonObj); err != nil {
panic(err)
}
// 安全访问:先检查切片长度
if len(jsonObj.Objects) > 0 {
fmt.Printf("First object name: %s\n", jsonObj.Objects[0].Name) // 输出: First object name: foo
} else {
fmt.Println("No objects found")
}
}? 关键注意事项:
- JSON数组中的每个元素必须严格匹配Go结构体字段类型;若定义为[]ObjectType,则每个数组项必须是合法JSON对象(以{}包裹);
- 始终在访问切片前校验长度(len(slice) > 0),避免因解析失败或空数组导致panic;
- 使用json.Unmarshal返回的错误值进行健壮性处理,而非忽略错误;
- 可借助Go Playground快速验证JSON格式与结构体映射关系。
遵循上述规范,即可安全、可靠地解析任意深度的嵌套JSON数组结构。

















