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

Go语言JSON反序列化报错:无法将数组解析为main.Data类型

解决Go JSON解析错误:json: cannot unmarshal array into Go value of type main.Data

你遇到的这个错误核心指向JSON数据结构和Go结构体不匹配——程序试图把一个JSON数组解析成main.Data类型的结构体,而非对应的数组类型。下面我们一步步排查并解决问题:

最可能的原因:JSON实际内容是数组而非单个对象

你提供的JSON示例是外层为单个对象的格式,但如果你的实际JSON文件是数组开头(比如[ {...} ]),就会触发这个错误。举个例子,如果你的JSON是:

[
  { 
    "apiAddr":"abc", 
    "data": [ 
      { "key":"uid1", "name":"test", "commandList":["dummy cmd"], "frequency":"1", "deviceList":["dev1"], "lastUpdatedBy": "user", "status":"Do something" } 
    ] 
  }
]

这种情况下,你需要把解析目标改成数组类型:

var testTemplates []Data // 这里要定义为[]Data而非Data
err = json.Unmarshal(raw, &testTemplates)

检查JSON格式与结构体Tag匹配

如果你的JSON确实是单个对象(和你提供的示例一致),请确认以下两点:

  • 确保JSON没有语法错误:比如多余的逗号、缺失的括号等,可通过JSON校验工具验证格式合法性。
  • 核对结构体的JSON Tag是否完全匹配:你的结构体定义看起来没问题,但再仔细检查一遍:
    type Data struct {
        APIAddr string     `json:"apiAddr"` // 严格匹配JSON的apiAddr
        Data    []Template `json:"data"`    // 严格匹配JSON的data数组
    }
    
    注意Tag的大小写必须和JSON字段完全一致(JSON里是小写的data,Tag不能写成Data)。

验证读取到的原始JSON内容

有时候文件读取可能出现异常(比如文件为空、包含隐藏字符),可以在代码中打印原始内容,确认和预期一致:

raw, err := ioutil.ReadFile(*testFile)
if err != nil {
    fmt.Printf("读取文件错误: %v\n", err)
    return
}
// 打印原始JSON内容,检查是否符合预期
fmt.Printf("原始JSON内容:\n%s\n", raw)

var testTemplates Data
err = json.Unmarshal(raw, &testTemplates)
if err != nil {
    fmt.Printf("解析错误: %v\n", err)
    return
}

测试最小可复现示例

如果还是有问题,可以写一段最小测试代码,直接用你提供的JSON字符串解析,排除文件读取的干扰:

package main

import (
    "encoding/json"
    "fmt"
)

type Data struct {
    APIAddr string     `json:"apiAddr"`
    Data    []Template `json:"data"`
}

type Template struct {
    Key           string   `json:"key"`
    Name          string   `json:"name"`
    CommandList   []string `json:"commandList"`
    Frequency     string   `json:"frequency"`
    DeviceList    []string `json:"deviceList"`
    LastUpdatedBy string   `json:"lastUpdatedBy"`
    Status        string   `json:"status"`
}

func main() {
    jsonStr := `{ "apiAddr":"abc", "data": [ { "key":"uid1", "name":"test", "commandList":["dummy cmd"], "frequency":"1", "deviceList":["dev1"], "lastUpdatedBy": "user", "status":"Do something" } ] }`
    
    var testTemplates Data
    err := json.Unmarshal([]byte(jsonStr), &testTemplates)
    if err != nil {
        fmt.Printf("错误: %v\n", err)
        return
    }
    
    fmt.Printf("解析成功: %+v\n", testTemplates)
}

运行这段代码如果能成功解析,说明你的结构体定义是正确的,问题出在实际JSON文件内容或读取流程中。

内容的提问来源于stack exchange,提问作者Supriya Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:56:09