Go中JSON数组反序列化为APPConfig结构体报错的解决方法
解决Go解析JSON数组报错"cannot unmarshal array into Go value of type config.APPConfig"
你的JSON配置文件是对象数组(外层用[]包裹),但当前代码中全局变量App是单个APPConfig结构体实例,json.Unmarshal无法将JSON数组解析到单个结构体对象中,因此抛出该错误。
调整方案
步骤1:修改全局变量为数组类型
将原来的单个APPConfig变量,改为APPConfig类型的切片(动态数组):
// 原代码 var App = APPConfig{ OpenAPIMode: "mqtt", OpenAPIURL: "openapi.tuyacn.com", } // 修改后(可保留默认配置,或初始化空切片) var App = []APPConfig{ { OpenAPIMode: "mqtt", OpenAPIURL: "openapi.tuyacn.com", }, } // 若不需要默认值,也可直接初始化空切片:var App []APPConfig
步骤2:确认解析逻辑无需额外修改
LoadConfig函数中传递&App给parseJSON即可,因为现在&App是*[]APPConfig类型,完全匹配JSON数组的解析需求:
func LoadConfig() error { return parseJSON("webrtc.json", &App) }
修改后的完整Config.go示例
package config import ( "encoding/json" "io/ioutil" ) type Easy struct { UID string `json:"uId"` } type Auth struct { Code string `json:"code"` } type APPConfig struct { OpenAPIMode string `json:"openAPIMode"` OpenAPIURL string `json:"openAPIUrl"` ClientID string `json:"clientId"` Secret string `json:"secret"` AuthMode string `json:"authMode"` Easy Easy `json:"easy"` Auth Auth `json:"auth"` DeviceID string `json:"deviceId"` UID string `json:"-"` MQTTUID string `json:"-"` AccessToken string `json:"-"` RefreshToken string `json:"-"` ExpireTime int64 `json:"-"` } // 修改为APPConfig切片类型 var App = []APPConfig{ { OpenAPIMode: "mqtt", OpenAPIURL: "openapi.tuyacn.com", }, } func LoadConfig() error { return parseJSON("webrtc.json", &App) } func parseJSON(path string, v interface{}) error { data, err := ioutil.ReadFile(path) if err != nil { return err } err = json.Unmarshal(data, v) return err }
读取后的使用示例
解析完成后,可通过遍历切片处理每个配置项:
// 示例:遍历所有配置 for _, config := range config.App { fmt.Printf("ClientID: %s, DeviceID: %s\n", config.ClientID, config.DeviceID) }
内容的提问来源于stack exchange,提问作者Blerni2.0
相关产品推荐
相关产品推荐

