
当服务返回的是 JSON 数组(如 [{"key":"a","value":"b"}, ...])时,需使用 []Struct 类型配合 json.Unmarshal 的地址解引用(&slice)进行反序列化,而非单个结构体。
当服务返回的是 json 数组(如 `[{"key":"a","value":"b"}, ...]`)时,需使用 `[]struct` 类型配合 `json.unmarshal` 的地址解引用(`&slice`)进行反序列化,而非单个结构体。
在 Go 中,json.Unmarshal 要求目标变量的地址必须可寻址,且类型需与 JSON 数据结构严格匹配。若 API 返回的是一个 JSON 对象数组(即顶层为 [...]),则 Go 中对应的目标类型必须是切片(如 []Property),而不能是单个结构体 Property —— 否则会触发经典的错误:
json: cannot unmarshal array into Go value of type main.Property
✅ 正确做法如下:
type Property struct {
Key string `json:"key"`
Secret bool `json:"secret"`
Type string `json:"type"`
Value string `json:"value"`
}
// 假设 resp 是从 HTTP 响应读取的 []byte
var props []Property
if err := json.Unmarshal(resp, &props); err != nil {
log.Fatal("JSON 解析失败:", err)
}
fmt.Printf("成功解析 %d 个属性:\n%+v\n", len(props), props)⚠️ 注意事项:
- 必须传入 &props(切片变量的地址),因为 Unmarshal 需要修改底层数组指针;
- 切片会自动扩容以容纳所有 JSON 对象,无需预先分配长度;
- 若 JSON 字段名与结构体字段不一致,务必通过 json 标签精确映射(如 json:"secret");
- 若响应可能为空数组 [] 或 null,建议添加空值校验或使用指针字段(如 *string)避免 panic。
? 扩展提示:若需同时支持单对象和数组(兼容性场景),可先尝试解析为 json.RawMessage,再根据首字符 '[' 或 '{' 分支处理——但常规 REST API 应遵循明确的响应契约,推荐统一使用数组格式并以 []Property 作为标准接收类型。


















