
本文介绍如何使用 Go 标准库 encoding/json 将 API 返回的 JSON 字符串安全反序列化为结构化 Go 值,并高效提取、分类(如区分 "show" 和 "movie")所需字段,最终生成可操作的字符串切片。
本文介绍如何使用 go 标准库 `encoding/json` 将 api 返回的 json 字符串安全反序列化为结构化 go 值,并高效提取、分类(如区分 "show" 和 "movie")所需字段,最终生成可操作的字符串切片。
在 Go 中处理 JSON 数据时,不能像 JavaScript 那样直接 JSON.parse() 后链式调用;必须先定义与 JSON 结构匹配的 Go 类型,再通过 json.Unmarshal 进行类型安全的反序列化。你从 API 获取的是一个 JSON 数组字节流([]byte),其内容为多个对象,每个对象包含 "Name" 和 "Type" 字段。正确的做法是:声明一个匿名结构体切片,然后解码到该变量中。
以下是一个完整、健壮的实现示例:
package main
import (
"encoding/json"
"fmt"
"log"
)
func main() {
// 假设这是从 API 获取的原始响应(注意:实际应为 []byte,此处为演示转为字符串再转回)
jsonData := `[{"Name": "Vikings", "Type": "show"},
{"Name": "Spartacus: Gods Of The Arena", "Type": "show"},
{"Name": "True Detective", "Type": "show"},
{"Name": "The Borgias", "Type": "show"},
{"Name": "Se7en", "Type": "movie"}]`
var items []struct {
Name string `json:"Name"`
Type string `json:"Type"`
}
if err := json.Unmarshal([]byte(jsonData), &items); err != nil {
log.Fatalf("JSON 解析失败: %v", err)
}
var shows, movies []string
for _, item := range items {
switch item.Type {
case "movie":
movies = append(movies, item.Name)
case "show":
shows = append(shows, item.Name)
// 可扩展:支持更多类型(如 "anime", "documentary")
default:
// 可选:记录未知类型或跳过
}
}
fmt.Println("电视剧:", shows)
fmt.Println("电影:", movies)
}✅ 关键要点说明:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 使用
[]struct{...}直接匹配 JSON 数组结构,无需预定义命名类型(适合一次性、简单场景);若需复用,建议定义具名结构体(如type MediaItem struct { Name, Type string })。 - JSON 字段名需通过
json:"Name"标签显式映射,确保大小写和拼写一致(Go 结构体字段首字母大写才可导出,且必须可导出才能被json包访问)。 -
json.Unmarshal接收*[]T(切片指针),务必传地址&items。 - 始终检查
err—— 无效 JSON、字段类型不匹配或缺失字段均会返回错误,忽略它将导致静默失败。
? 进阶提示:
- 若需动态过滤(如用户输入
"show"),可封装为函数:filterByType(items, "show") []string; - 对于大型数据集,考虑使用
json.Decoder流式解析以降低内存占用; - 若 JSON 结构复杂或嵌套,可结合
json.RawMessage延迟解析部分字段。
通过这种方式,你就能将原始字符串彻底转化为类型安全、可遍历、可过滤的 Go 原生数据,真正发挥 Go 静态类型与编译期检查的优势。

















