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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:37:46