GJSON (github.com/tidwall/gjson) 是一个专注于高效解析和查询 JSON 数据的 Go 语言库。
它的设计目标是提供一种简单、快速的方式来处理 JSON 数据,尤其是在只需要提取部分数据的场景下,它比标准库更加高效。
其作者 Josh Baker 是一位知名的 Go 语言开发者,他是多个流行 Go 库的作者,以其高性能、简洁的开源库而闻名。
核心优势
- 无需结构体绑定:不需要将整个 JSON 数据解析为 Go 结构体。它允许你只提取你感兴趣的部分数据,从而减少了内存开销。
- 高效:性能优越,通过直接操作 JSON 字符串来避免不必要的内存分配和复制操作,从而大大提高了性能。尤其是在处理大型 JSON 数据时,性能优势更加明显。
- 支持路径查询:使用简单的路径表达式获取数据。例如,"user.name" 可以提取 JSON 对象中 user 字段下的 name 字段。
适用场景
- 快速提取嵌套 JSON 数据中的特定字段。
- 处理动态结构的 JSON 数据,无需提前定义结构体。
基本用法
GJSON 提供了一个 Get 函数,用于搜索 JSON 中指定的路径。
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
const json = `{
"code": 200,
"data":{
"user": {
"id": "230011",
"name": "John Doe",
}
}
}`
func main() {
code := gjson.Get(json, "code").Int()
fmt.Println(code)
userID := gjson.Get(json, "data.user.id").String()
fmt.Println(userID)
}
// Output:
// 200
// 230011
此外,GJSON 还提供了 GetBytes 函数,用于处理 JSON 字节切片。
var json []byte = ...
result := gjson.GetBytes(json, path)
路径语法
以下是 path 语法的简单示例。
{
"name": {"first": "Tom", "last": "Anderson"},
"age":37,
"children": ["Sara","Alex","Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
{"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
{"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
]
}
"name.last" >> "Anderson"
"age" >> 37
"children" >> ["Sara","Alex","Jack"]
"children.#" >> 3
"children.1" >> "Alex"
"child*.2" >> "Jack"
"c?ildren.0" >> "Sara"
"fav.movie" >> "Deer Hunter"
"friends.#.first" >> ["Dale","Roger","Jane"]
"friends.1.last" >> "Craig"
有关完整的路径语法,请参阅 GJSON 语法文档(github.com/tidwall/gjs…
GJSON 是一个高效、灵活的 JSON 解析库,特别适合在只需要提取部分 JSON 数据的场景下使用。它的高性能和简洁的 API 使得它成为 Go 语言开发者的有力工具。如果你正在寻找一种更高效的 JSON 处理方式,GJSON 绝对值得一试。
References
github.com/tidwall/gjs…