Golang爬取JSON数据的实用技巧

Golang爬取JSON数据的实用技巧 在Python中,extruct包可以获取JSON数据、微数据和元数据。Go语言中是否有类似的包可以获取JSON数据?

2 回复

您可以使用 net/http.Client 及其便捷函数 GetPost 等从远程服务器获取数据。然后可以使用 encoding/json 包来解码获取到的 JSON 数据。

func main() {
    fmt.Println("hello world")
}

更多关于Golang爬取JSON数据的实用技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,虽然没有与Python的extruct包完全相同的库,但可以通过标准库encoding/json和一些第三方包高效地处理JSON数据。以下是几种实用技巧和示例代码:

1. 使用标准库encoding/json解析JSON数据

这是最基础且常用的方法,适用于结构已知的JSON数据。

package main

import (
    "encoding/json"
    "fmt"
)

type Product struct {
    Name  string  `json:"name"`
    Price float64 `json:"price"`
}

func main() {
    jsonData := `{"name": "Laptop", "price": 999.99}`
    var product Product
    err := json.Unmarshal([]byte(jsonData), &product)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Product: %s, Price: $%.2f\n", product.Name, product.Price)
}

2. 使用map[string]interface{}处理动态JSON结构

当JSON结构未知或动态变化时,可以使用map[string]interface{}进行解析。

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonData := `{"name": "Smartphone", "price": 599.99, "features": ["5G", "OLED"]}`
    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonData), &data)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Name: %v\n", data["name"])
    fmt.Printf("Price: %v\n", data["price"])
    fmt.Printf("Features: %v\n", data["features"])
}

3. 使用第三方包github.com/tidwall/gjson快速提取特定字段

对于大型JSON数据,gjson包提供高性能的字段提取功能,无需解析整个结构。

package main

import (
    "fmt"
    "github.com/tidwall/gjson"
)

func main() {
    jsonData := `{"products": [{"name": "Tablet", "price": 299.99}, {"name": "Headphones", "price": 149.99}]}`
    result := gjson.Get(jsonData, "products.1.name")
    fmt.Printf("Second product name: %s\n", result.String())
}

4. 使用github.com/antchfx/htmlquery结合encoding/json处理HTML中的JSON数据

如果需要从HTML页面中提取JSON数据(例如通过<script>标签),可以先用htmlquery解析HTML,再用json包处理。

package main

import (
    "encoding/json"
    "fmt"
    "github.com/antchfx/htmlquery"
    "golang.org/x/net/html"
)

func main() {
    // 示例:假设从HTML中提取JSON字符串
    htmlContent := `<script type="application/json">{"title": "Go Book", "author": "Author Name"}</script>`
    doc, err := htmlquery.Parse(strings.NewReader(htmlContent))
    if err != nil {
        panic(err)
    }
    scriptNode := htmlquery.FindOne(doc, "//script[@type='application/json']")
    if scriptNode != nil {
        jsonText := htmlquery.InnerText(scriptNode)
        var metadata map[string]string
        err := json.Unmarshal([]byte(jsonText), &metadata)
        if err != nil {
            panic(err)
        }
        fmt.Printf("Title: %s, Author: %s\n", metadata["title"], metadata["author"])
    }
}

这些方法覆盖了从简单到复杂的JSON数据处理场景。对于微数据和元数据,Go社区中虽然没有直接等效于extruct的包,但通过组合标准库和第三方包(如gjson用于查询、htmlquery用于HTML解析)可以实现类似功能。

回到顶部