
go中json解码报错“cannot unmarshal array into go value of type main.first”,根本原因是go结构体定义与实际json数据结构不匹配——当json是顶层数组时,应直接解码为切片,而非嵌套在包装结构体内。
go中json解码报错“cannot unmarshal array into go value of type main.first”,根本原因是go结构体定义与实际json数据结构不匹配——当json是顶层数组时,应直接解码为切片,而非嵌套在包装结构体内。
在Go语言中,json.Unmarshal 或 json.Decoder.Decode 要求Go值的类型必须严格对应JSON数据的外层结构。你提供的JSON数据:
[{
"name": "rdj",
"place": "meh",
"meh": ["bow", "blah"]
}]是一个顶层JSON数组([]object),而非键值对对象(如 {"A": [...]})。因此,解码目标必须是 []one 类型的切片,而不是包裹了字段 A 的结构体 first。
✅ 正确做法:直接解码为切片
type one struct {
Name string `json:"name"` // 注意:struct tag 中的冒号是英文冒号,且无空格
Place string `json:"place"`
Meh []string `json:"meh"` // 若需读取 "meh" 字段,需显式声明
}
func main() {
res, err := http.Get("http://127.0.0.1:8080/sample/")
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var some []one // ← 关键:直接声明为切片,匹配JSON顶层数组
decoder := json.NewDecoder(res.Body)
if err := decoder.Decode(&some); err != nil {
log.Fatal("JSON decode error:", err)
}
fmt.Printf("%+v\n", some)
// 输出:[{Name:"rdj" Place:"meh" Meh:["bow" "blah"]}]
}⚠️ 常见错误与修正要点
-
Struct tag 格式错误:原代码中
json: "place"缺少引号且有空格,应为`json:"place"`; -
字段遗漏:原始JSON含
"meh": ["bow", "blah"],若未在one中定义Meh []string字段,该字段将被静默忽略(非报错,但数据丢失); -
过度封装:定义
type first struct { A []one }仅适用于如下JSON:{"A": [{...}, {...}]}此时才应使用
var some first并解码;而你的响应是纯数组,无需中间结构体。
Comprehensive Three.js 3D graphics reference下载详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
? 补充建议:增强健壮性
// 推荐:显式检查HTTP状态码 & 使用 io.ReadAll 防止 body 提前关闭问题(可选)
body, err := io.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
if res.StatusCode != http.StatusOK {
log.Fatalf("HTTP %d: %s", res.StatusCode, string(body))
}
var some []one
if err := json.Unmarshal(body, &some); err != nil {
log.Fatal("JSON parse error:", err)
}总之,Go JSON解码的核心原则是:结构体形状 = JSON形状。看清响应是 []T 还是 {"key": [...]},再选择 []T 或 struct{ Key []T },即可避免此类 panic。
立即学习“go语言免费学习笔记(深入)”;

















