还有两个比较好的库吧,其中 gjson 好像很早很早之前,我就在使用了。
GJSON:快速读取 JSON 局部字段
GJSON 是一个面向读取的 JSON 查询库。它不要求先定义结构体或反序列化整个对象,可以通过点路径直接取得字段,也支持数组下标、通配符、数组查询、遍历与 JSON Lines。官方将它定位为快速、简洁地从 JSON 文档中取值的工具。GJSON
jsonText := `{
"user": {
"name": "thh",
"projects": ["gopt", "onesite"]
}
}`
name := gjson.Get(jsonText, "user.name").String()
project := gjson.Get(jsonText, "user.projects.0").String()
常用能力:
gjson.Get(json, "a.b.c"):按路径读取字段。
result.ForEach(...):遍历对象或数组。
result.Exists():判断路径是否存在。
gjson.Valid(json):校验 JSON。
friends.#(age>18)#.name:按条件筛选数组元素。
gjson.GetBytes:直接处理 []byte,避免不必要的字符串转换。
我之前用它做过 JSON 结构分析和 JSON 转 Markdown 表格。面对字段不固定、只读、需要快速探索的 API 响应时,它比先建一堆 Go struct 更顺手。
但它不适合承担业务模型的完整反序列化、严格校验或修改 JSON。那些场景里,encoding/json 加明确的结构体通常更清晰。
chromedp:用 Go 驱动 Chrome
chromedp 是 Go 的 Chrome DevTools Protocol 客户端,可以通过 Go 代码控制 Chrome 或 Chromium:打开页面、点击、输入、等待元素、执行 JavaScript、截图、抓取渲染后的 DOM 等。它适合处理普通 HTTP 请求拿不到内容的动态网站。chromedp
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var title string
err := chromedp.Run(ctx,
chromedp.Navigate("https://example.com"),
chromedp.Title(&title),
)
常用能力:
Navigate:访问页面。
WaitVisible:等待动态元素出现。
Click、SendKeys:模拟用户操作。
Evaluate:执行页面 JavaScript 并读取结果。
Screenshot:截取页面或元素。
NewExecAllocator:配置 headless、User-Agent、浏览器路径等运行参数。
我之前用它做 YH 爬虫:启动 Chrome,访问动态页面,等待播放器元素加载,再通过 JavaScript 读取播放器地址。
它的代价也很明显:它不是普通 HTTP 抓取,而是启动真实浏览器进程,所以更占内存、依赖本机 Chrome/Chromium 环境,页面结构变化也容易导致脚本失效。官方默认以 headless 模式运行 Chrome,并建议长运行浏览器场景使用远程浏览器连接。chromedp FAQ