解码 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 反馈 — 无需本地设置。
此课程中的所有课时
- 发起 HTTP 请求
- 设置超时与请求头
- 解码 JSON 响应
- 错误处理与重试逻辑