Go JSON解码报错:无法将数组反序列化到结构体中
解决Go JSON解码错误:cannot unmarshal array into Go struct
这个错误的核心问题是你的Go结构体层级和JSON数据的结构不匹配,我来帮你拆解并修复:
问题分析
你定义的AjaxModels结构体中,Data字段是map[string]AjaxModelsData,这意味着你期望JSON里的data是一个由字符串键和AjaxModelsData值组成的映射。但从你给出的JSON片段来看,data直接包含了一个ModelList数组——而AjaxModelsData本身又定义了ModelList字段,这就造成了解码时的冲突:Go试图把JSON中的ModelList数组解析成AjaxModelsData结构体,自然会抛出“不能将数组解析为结构体”的错误。
修复方案
根据你的JSON结构,最直接的修复是调整AjaxModels的Data字段类型,去掉多余的map[string]层,让它直接对应AjaxModelsData:
type AjaxModels struct { Status bool `json:"status"` Data AjaxModelsData `json:"data"` // 移除map[string],直接使用AjaxModelsData }
验证示例
修复后的完整代码可以正常解码你的JSON:
package main import ( "encoding/json" "fmt" ) type AjaxModelsList struct { Id float64 `json:"Id"` Name string `json:"Name"` CarId float64 `json:"CarId"` EngName string `json:"EngName"` } type AjaxModelsData struct { ModelList []AjaxModelsList `json:"ModelList"` } type AjaxModels struct { Status bool `json:"status"` Data AjaxModelsData `json:"data"` // 修正后的字段类型 } func main() { jsonStr := `{ "status": true, "data": { "ModelList": [{ "Id": 1, "Name": "foo", "CarId": 3, "EngName": "foo_eng" }] } }` var result AjaxModels err := json.Unmarshal([]byte(jsonStr), &result) if err != nil { fmt.Printf("解码失败: %v\n", err) return } fmt.Printf("成功解码: %+v\n", result) }
额外说明
如果你确实需要Data字段是map[string]AjaxModelsData(比如JSON的data可能包含动态变化的键),那么你的JSON结构需要调整成这样:
{ "status": true, "data": { "任意键名": { "ModelList": [{...}] } } }
但结合你提供的JSON片段,显然第一种修复方案更符合你的实际需求。
内容的提问来源于stack exchange,提问作者ufk
相关产品推荐
相关产品推荐

