0Pricing
Go Academy · 课时

解码 JSON 响应

将 API 响应解析为 Go 结构体

解码 JSON 响应 是 CoddyKit 上的免费 Go Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

解码前检查状态

始终先验证响应状态为 2xx,再尝试解码正文。非 2xx 响应可能包含 HTML 错误页面,而不是 JSON。

if resp.StatusCode < 200 || resp.StatusCode >= 300 {
    body, _ := io.ReadAll(resp.Body)
    return fmt.Errorf("status %d: %s", resp.StatusCode, body)
}

json.NewDecoder

以流式方式解码响应正文,而无需将其全部载入内存:

var result APIResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
    return fmt.Errorf("decode: %w", err)
}

解码为通用映射

对于未知或动态的 JSON 结构,请解码为 map[string]any:

var m map[string]any
json.NewDecoder(resp.Body).Decode(&m)

嵌套结构体

使用嵌套的 Go 结构体和 json 标签为嵌套 JSON 建模:

type Repo struct {
    Name  string `json:"name"`
    Owner struct {
        Login string `json:"login"`
    } `json:"owner"`
}

使用指针表示可选字段

对可选的 JSON 字段使用指针类型,以便区分“字段缺失”和“字段被设置为零值”:

type Response struct {
    Data  *string `json:"data"`
    Error *string `json:"error"`
}

解码数组

将 JSON 数组直接解码为 Go 切片:

var users []User
json.NewDecoder(resp.Body).Decode(&users)

检查解码错误

区分 JSON 语法错误与意外的 EOF 错误——EOF 表示正文为空(完全没有 JSON)。

err := json.NewDecoder(resp.Body).Decode(&v)
if errors.Is(err, io.EOF) {
    return fmt.Errorf("empty response body")
}

检查 Content-Type

解码前验证响应的 Content-Type 是否为 application/json,以避免将 HTML 悄悄解析为 JSON。

ct := resp.Header.Get("Content-Type")
if !strings.HasPrefix(ct, "application/json") {
    return fmt.Errorf("unexpected content-type: %s", ct)
}

忽略未知字段

json.Decoder 会悄悄忽略没有匹配结构体字段的 JSON 字段。这是默认行为,通常有利于保持向前兼容。

使用 DisallowUnknownFields 进行严格解码

调用 dec.DisallowUnknownFields(),对未知键返回错误——这对严格解析配置很有用,但不适合使用第三方 API。

dec := json.NewDecoder(r.Body)
dec.DisallowUnknownFields()
dec.Decode(&cfg)

复用已解码的结构体

如果在多个响应之间复用结构体,请在解码前将其清零,以避免上一次解码留下陈旧数据。

var result APIResult
result = APIResult{} // reset
json.NewDecoder(resp.Body).Decode(&result)

快速检查

响应正文为空时,json.Decoder.Decode 会返回什么错误?

回顾:解码 JSON 响应

要点:

  • 解码前检查状态码
  • 使用 json.NewDecoder 进行流式解码,避免将完整正文载入内存
  • 验证 Content-Type 是否为 application/json
  • io.EOF 表示正文为空;io.ErrUnexpectedEOF 表示 JSON 被截断

常见问题解答

「解码 JSON 响应」课时是免费的吗?

是的 — 「解码 JSON 响应」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「解码 JSON 响应」这节课中我会学到什么?

将 API 响应解析为 Go 结构体 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「解码 JSON 响应」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 发起 HTTP 请求
  2. 设置超时与请求头
  3. 解码 JSON 响应
  4. 错误处理与重试逻辑
← 返回 Go Academy