
当 JSON 数据为单个对象(如 {"title":"..."})而非数组时,需使用结构体变量而非结构体切片进行 json.Unmarshal,否则会触发“cannot unmarshal object into Go value of type []main.parsed”错误。
当 json 数据为单个对象(如 {"title":"..."})而非数组时,需使用结构体变量而非结构体切片进行 json.unmarshal,否则会触发“cannot unmarshal object into go value of type []main.parsed”错误。
在 Go 中,json.Unmarshal 的目标类型必须与 JSON 数据的实际结构严格匹配。常见错误是:JSON 响应是一个单个对象(例如 {"title":"Go Tutorial"}),但代码却声明了切片类型 []parsed,导致反序列化失败。
✅ 正确做法:根据 JSON 形态选择目标类型
-
若 API 返回的是 单个 JSON 对象(以
{...}开头):
Comprehensive Three.js 3D graphics reference下载详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
type parsed struct { Title string `json:"title,omitempty"` // 注意:"string" 标签通常不必要,且可能干扰解析 } var jsonData parsed err := json.Unmarshal(body, &jsonData) // 直接传入结构体地址 -
若返回的是 JSON 数组(以
[...]开头,如[{"title":"A"},{"title":"B"}]):var jsonData []parsed err := json.Unmarshal(body, &jsonData) // 切片需取地址
⚠️ 其他关键注意事项
-
移除冗余的
string标签:json:"title,string,omitempty"中的string表示期望 JSON 中该字段为字符串编码的数字(如"123"→int),但对string类型字段无意义,反而可能引发解析异常。应简化为:json:"title,omitempty"。 -
始终检查错误:不要忽略
json.Unmarshal的返回错误,建议用if err != nil显式处理。 -
确保结构体字段导出:字段名首字母必须大写(如
Title),否则json包无法访问。 -
推荐使用
bytes.NewReader或直接传body:ioutil.ReadAll已被弃用,建议升级为io.ReadAll(Go 1.16+),并注意resp.Body需关闭(可用defer resp.Body.Close())。
✅ 完整修正示例
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
type parsed struct {
Title string `json:"title,omitempty"`
}
func Function(args []string) string {
resp, err := http.Get("https://api.example.com/item")
if err != nil {
return "request failed"
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "read failed"
}
var jsonData parsed // ✅ 单对象 → 使用结构体变量
if err := json.Unmarshal(body, &jsonData); err != nil {
return fmt.Sprintf("unmarshal error: %v", err)
}
fmt.Printf("Parsed title: %s\n", jsonData.Title)
return jsonData.Title
}? 小技巧:调试时可先打印原始
body(fmt.Printf("Raw: %s\n", body)),确认 JSON 结构是{...}还是[...],再决定目标类型——这是避免此类错误最有效的方法。

















