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

选择合适的方法

  1. 已知 JSON 结构时,推荐使用 结构体解析,代码更安全、可读性更高。
  2. 未知或动态 JSON 结构时,推荐使用 map[string]interface{} 解析,更具灵活性。
posted @ 2024-12-10 15:21  __username  阅读(5)  评论(0编辑  收藏  举报

本文作者:DIVMonster

本文链接:https://www.cnblogs.com/guangzan/p/12886111.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。