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