You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.10 16:15:45