Golang解析JSON数组访问嵌套元素运行报错如何解决
问题诱因
- Go标准库
encoding/json默认对无tag的导出结构体字段采用大小写精确匹配规则:只会把和结构体字段名完全一致(包括大小写)的JSON键值解析到对应字段,不会自动适配大小写差异。 - 你定义的结构体中外层字段名是
Args(首字母大写A)、内层字段名是Foo(首字母大写F),但待解析JSON里的对应键是全小写的args、foo,键名不匹配导致两个字段全程没有被赋值,始终为零值空字符串。 - 代码没有处理
json.Unmarshal的返回错误,也没有校验切片长度:如果输入JSON格式非法、解析失败,切片d可能长度不足,此时访问d[1]会直接触发index out of range的运行时panic,也就是你遇到的报错。
修正方案
给结构体字段添加JSON tag,明确指定和JSON数据对应的小写键名,同时增加必要的错误检查、长度校验逻辑,从根源避免解析失败和越界问题。
修正后的可运行代码:
package main import ( "encoding/json" "fmt" ) type Data struct { Args struct { Foo string `json:"foo"` // 显式映射JSON中的foo键 } `json:"args"` // 显式映射JSON中的args键 } func main() { in := `[{"args": {"foo": "bar"}},{"args": {"foo": "bxar"}}]` var d []Data // 检查JSON解析错误 if err := json.Unmarshal([]byte(in), &d); err != nil { fmt.Printf("解析JSON失败: %v\n", err) return } // 校验切片长度,避免越界 if len(d) < 2 { fmt.Println("解析得到的数据长度不足,无法访问索引1的元素") return } fmt.Println("Foo:", d[1].Args.Foo) }
运行上述代码会正常输出预期结果:Foo: bxar。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

