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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:45:02