Go中将HTTP请求响应字符串转换为结构体后字段为空如何解决
问题根因
- 你在调用
json.NewDecoder解码响应前,已经通过ioutil.ReadAll(resp.Body)把响应流一次性读取完毕了。HTTP响应的Body是仅可读取一次的IO流,读取完成后流指针会停在末尾,后续再读取拿不到任何数据,所以解码出来的结构体自然全是空值。 - 额外注意:你忽略了
ioutil.ReadAll的错误返回,可能会漏掉读取响应失败的异常,同时原代码没有关闭resp.Body,会造成资源泄漏。
修复方案
直接用已经读到内存的respBody做JSON反序列化即可,不需要再从resp.Body重复读取,修改解码部分的代码:
// 读取响应加上错误处理 respBody, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("读取响应失败:", err) return } // 用完关闭响应体避免资源泄漏 defer resp.Body.Close() d := data{} // 改为用Unmarshal解析已经读取到的respBody err = json.Unmarshal(respBody, &d) if err != nil { fmt.Println("JSON解析失败:", err) }
优化建议
按照Go语言的命名规范,结构体字段推荐使用驼峰命名,只要JSON标签对应正确即可正常解析,示例:
type Data struct { AccessToken string `json:"access_token"` RefreshToken string `json:"refresh_token"` }
内容的提问来源于stack exchange,提问作者Jon Nicholson
相关产品推荐
相关产品推荐

