go json
在 Go 语言中,当爬虫返回 JSON 数据时,可以通过 encoding/json
包解析 JSON 数据并提取其中的值。以下是两种常见方法来解析 JSON 数据并获取特定字段(如 code
)。
示例 JSON 数据
假设你爬取到的 JSON 数据如下:
{ "code": 200, "message": "成功", "data": { "user": "张三", "email": "zhangsan@example.com" } }
方法 1:使用结构体解析 JSON
这种方法适合知道 JSON 数据结构的情况。将 JSON 映射到 Go 的结构体,然后提取需要的字段。
示例代码
package main import ( "encoding/json" "fmt" ) type Response struct { Code int `json:"code"` Message string `json:"message"` Data struct { User string `json:"user"` Email string `json:"email"` } `json:"data"` } func main() { // 模拟爬虫返回的 JSON 数据 jsonStr := `{ "code": 200, "message": "成功", "data": { "user": "张三", "email": "zhangsan@example.com" } }` // 解析 JSON 数据 var resp Response err := json.Unmarshal([]byte(jsonStr), &resp) if err != nil { fmt.Println("解析 JSON 失败:", err) return } // 提取字段值 fmt.Println("Code:", resp.Code) fmt.Println("Message:", resp.Message) fmt.Println("User:", resp.Data.User) fmt.Println("Email:", resp.Data.Email) }
输出
Code: 200 Message: 成功 User: 张三 Email: zhangsan@example.com
方法 2:
map[string]interface{}
解析 JSON
这种方法适合不知道 JSON 数据结构的情况。通过映射到通用的 map
来动态提取字段。
示例代码
package main import ( "encoding/json" "fmt" ) func main() { // 模拟爬虫返回的 JSON 数据 jsonStr := `{ "code": 200, "message": "成功", "data": { "user": "张三", "email": "zhangsan@example.com" } }` // 将 JSON 字符串解析为 map var result map[string]interface{} err := json.Unmarshal([]byte(jsonStr), &result) if err != nil { fmt.Println("解析 JSON 失败:", err) return } // 提取字段值 code := result["code"].(float64) // JSON 数字默认解析为 float64 message := result["message"].(string) data := result["data"].(map[string]interface{}) user := data["user"].(string) email := data["email"].(string) fmt.Println("Code:", int(code)) fmt.Println("Message:", message) fmt.Println("User:", user) fmt.Println("Email:", email) }
输出
Code: 200 Message: 成功 User: 张三 Email: zhangsan@example.com
注意事项
- 通过
map[string]interface{}
解析 JSON 时,数字类型默认会被解析为float64
,需要类型转换。 - 使用类型断言时(如
result["code"].(float64)
),要确保字段存在并且类型匹配,否则会触发panic
。
选择合适的方法
- 已知 JSON 结构时,推荐使用 结构体解析,代码更安全、可读性更高。
- 未知或动态 JSON 结构时,推荐使用
map[string]interface{}
解析,更具灵活性。
本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18597451
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-12-10 安装jsdom/tough-cookie 【Error: Cannot find module ‘jsdom‘】的解决方法