Go语言从URL获取JSON后解析失败,无法映射到结构体求助
解决Go JSON解析失败的问题
嘿,我看了你的代码和输出,问题出在JSON结构和你的Go结构体不匹配上,咱们一步步来修复:
首先看你拿到的JSON返回内容:
{"user":[{"ProductId":1,"ProductName":"Helmet"},{"ProductId":2,"ProductName":"Glove"},{"ProductId":3,"ProductName":"Detecttor"}]}
这个JSON的最外层是一个包含user字段的对象,而user的值是一个Product对象数组,但你的代码直接把整个JSON解析到单个Product结构体里,这肯定匹配不上;另外你的Product结构体的JSON标签和实际返回的字段名也不对应——JSON里的字段是ProductId和ProductName,但你写的标签是json:"id"和json:"description",这也会导致映射失败。
修正后的代码
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "os" ) // 定义单个Product结构体,标签和JSON字段完全对应 type Product struct { ProductId int `json:"ProductId"` ProductName string `json:"ProductName"` } // 定义外层响应结构体,对应JSON最外层的user数组 type Response struct { User []Product `json:"user"` } func main() { url := "https://script.googleusercontent.com/macros/echo?user_content_key=WBSJPDNSN6X1FCYeXsR6TDaDval0vdvmSoMmXFhGbt5sfK0ia80Dp7kPD27GLpZbYz8vrwfDiUecI2oGMjEtgfL5o8Da25T1m5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnGb6k9xaGtOX6M1tIiG811CRpk9nXl8ZKS7UJTno1dvQXMe1kqfAj8WxsSkLor-EqzOmbnRGq-tk&lib=M0B6GXYh0EOYMkP7qr1Xy9xw8GuJxFqGH" resp, err := http.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() htmlData, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) os.Exit(1) } fmt.Println(string(htmlData)) var respData Response err = json.Unmarshal(htmlData, &respData) if err != nil { // 新增错误检查,方便排查解析问题 log.Fatal("JSON解析失败:", err) } // 遍历输出每个Product信息 for _, p := range respData.User { fmt.Printf("ID: %d, Description: %s\n", p.ProductId, p.ProductName) } }
关键改动点说明
- 新增
Response结构体,用来匹配JSON最外层的user数组字段,确保解析时能正确定位到数组数据。 - 修改
Product结构体的JSON标签,让json:"ProductId"和json:"ProductName"完全对应返回的JSON字段名。 - 把
ProductId的类型改成int,因为JSON里的ID是数字类型,原来的string类型会导致解析失败。 - 新增了解析错误的检查,后续遇到类似问题能快速定位原因。
运行这段代码后,就能正确输出每个Product的ID和名称了。
内容的提问来源于stack exchange,提问作者Hasan A Yousef
相关产品推荐
相关产品推荐

