Go语言:如何在结构体中定义多维数组实现JSON反序列化?
解决Go JSON反序列化数组到结构体的问题
你的问题核心很明确:JSON里的Users是一个数组(包含两个用户对象),但你在Root结构体里把Myuser字段定义成了单个Users结构体,这就导致JSON包无法把数组转换成单个结构体,所以抛出了cannot unmarshal array into go struct field Root.Myuser的错误。
修正方案:把Myuser定义为切片类型
Go中,JSON数组对应的是Go的**切片(slice)**类型,所以你只需要把Root结构体里的Myuser字段类型从Users改成[]Users即可。
修正后的完整结构体定义
type Root struct { ID string `json:"id,omitempty"` Title string `json:"Title,omitempty"` Myuser []Users `json:"Users,omitempty"` // 这里改成切片类型[]Users Tag string `json:"Tag,omitempty"` } type Users struct { ID string `json:"id,omitempty"` Name string `json:"Name,omitempty"` } type Unmarh struct { Me []Root `json:"me"` }
完整测试代码
下面是可以直接运行的示例,验证反序列化是否正常:
package main import ( "encoding/json" "fmt" ) type Root struct { ID string `json:"id,omitempty"` Title string `json:"Title,omitempty"` Myuser []Users `json:"Users,omitempty"` Tag string `json:"Tag,omitempty"` } type Users struct { ID string `json:"id,omitempty"` Name string `json:"Name,omitempty"` } type Unmarh struct { Me []Root `json:"me"` } func main() { // 你的JSON数据 response := []byte(`{"me":[{"id": "0xcfd","Title":"Story of Stackoverflow","Users":[{"id":"1","Name":"MetaBoss"},{"id":"2","Name":"Owner"}],"Tag":"golang,programming"}]}`) var r Unmarh err := json.Unmarshal(response, &r) if err != nil { fmt.Printf("反序列化错误: %v\n", err) return } // 打印获取到的用户数据 fmt.Println("第一个Root对象的用户列表:") for _, user := range r.Me[0].Myuser { fmt.Printf("ID: %s, Name: %s\n", user.ID, user.Name) } }
运行结果
执行这段代码后,你会看到正确输出:
第一个Root对象的用户列表: ID: 1, Name: MetaBoss ID: 2, Name: Owner
这样就能正常获取到Users数组里的数据了,核心就是匹配JSON结构和Go结构体的类型:JSON数组对应Go切片,JSON对象对应Go结构体。
内容的提问来源于stack exchange,提问作者Lambda killed App
相关产品推荐
相关产品推荐

