Golang爬取JSON数据的实用技巧
Golang爬取JSON数据的实用技巧 在Python中,extruct包可以获取JSON数据、微数据和元数据。Go语言中是否有类似的包可以获取JSON数据?
2 回复
您可以使用 net/http.Client 及其便捷函数 Get、Post 等从远程服务器获取数据。然后可以使用 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解析)可以实现类似功能。

