【gjson使用方法】
gjson使用方法
- 1. 安装
- 2. 基本方法
- 2.1 获取字段值:Get
- 2.2 通配符 * 遍历数组/对象
- 2.3 条件查询:#(条件)
- 2.4 多路径查询:GetMany
- 2.5 检查字段存在性
- 2.6 类型判断
- 3. 高级用法
- 3.1 预解析 JSON
- 3.2 转义特殊字符
- 3.3 遍历数组元素
- 3.4 修改 JSON(需结合 sjson)
- 4. 路径语法速查
- 5. 注意事项
gjson 是一个用于快速查询和解析 JSON 数据的 Go 语言库。它通过灵活的路径语法实现高效的数据提取,无需预先定义结构体。以下是其核心方法及用法详解:
1. 安装
go get github.com/tidwall/gjson
2. 基本方法
2.1 获取字段值:Get
jsonStr := `{"name":"John", "age":30, "pets":["cat", "dog"]}`
result := gjson.Get(jsonStr, "name") // 获取 "name" 值
fmt.Println(result.String()) // 输出: John
// 嵌套结构
jsonNested := `{"user":{"name":"John", "age":30}}`
age := gjson.Get(jsonNested, "user.age").Int()
fmt.Println(age) // 输出: 30
// 数组索引
pets := gjson.Get(jsonStr, "pets.1") // 获取第二个宠物
fmt.Println(pets.String()) // 输出: dog
2.2 通配符 * 遍历数组/对象
jsonUsers := `{"users":[{"name":"John"}, {"name":"Jane"}]}`
results := gjson.Get(jsonUsers, "users.*.name")
for _, name := range results.Array() {
fmt.Println(name.String()) // 输出: John 和 Jane
}
2.3 条件查询:#(条件)
jsonData := `{"users":[{"name":"John", "age":30}, {"name":"Jane", "age":25}]}`
// 查找年龄大于25的用户名
result := gjson.Get(jsonData, `users.#(age>25).name`)
fmt.Println(result.String()) // 输出: John
2.4 多路径查询:GetMany
values := gjson.GetMany(jsonStr, "name", "age", "pets.1")
for _, res := range values {
fmt.Println(res.String())
}
// 输出: John, 30, dog
2.5 检查字段存在性
exists := gjson.Get(jsonStr, "address").Exists()
if !exists {
fmt.Println("字段不存在")
}
2.6 类型判断
result := gjson.Get(jsonStr, "age")
if result.Type == gjson.Number {
fmt.Println("字段是数字类型")
}
3. 高级用法
3.1 预解析 JSON
提升重复查询性能:
parsed := gjson.Parse(jsonStr)
name := parsed.Get("name").String()
3.2 转义特殊字符
处理含 . 的字段名:
json := `{"user.name": "John"}`
result := gjson.Get(json, `user\.name`)
fmt.Println(result.String()) // 输出: John
3.3 遍历数组元素
jsonArray := `["apple", "banana", "cherry"]`
gjson.Get(jsonArray, "@this").ForEach(func(_, value gjson.Result) bool {
fmt.Println(value.String())
return true // 继续遍历
})
3.4 修改 JSON(需结合 sjson)
import "github.com/tidwall/sjson"
modified, _ := sjson.Set(jsonStr, "name", "Alice")
fmt.Println(modified) // {"name":"Alice", "age":30, ...}
4. 路径语法速查
语法 说明
name 获取字段
user.age 嵌套字段
users.1 数组索引(从0开始)
users.*.name 遍历数组获取所有 name
users.# 获取数组长度
users.#(age>25) 条件过滤
5. 注意事项
性能优势: gjson 直接按路径解析,无需解析整个 JSON,适合处理大文件。
错误处理: 字段不存在时返回 Result{},需用 Exists() 检查。
类型安全: 使用 Int(), String() 等方法时,确保类型匹配。