golang一行代码快速获取JSON值插件库GJSON的使用
Golang一行代码快速获取JSON值插件库GJSON的使用
GJSON是一个Go语言包,提供了一种快速简单的方式来从JSON文档中获取值。它具有一行检索、点符号路径、迭代和解析JSON行等功能。
安装
$ go get -u github.com/tidwall/gjson
基本用法
获取值
package main
import "github.com/tidwall/gjson"
const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}`
func main() {
value := gjson.Get(json, "name.last") // 一行代码获取JSON值
println(value.String()) // 输出: Prichard
}
路径语法
GJSON使用点符号路径来查询JSON值:
{
"name": {"first":"Tom", "last":"Anderson"},
"age":37,
"children": ["Sara","Alex","Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"first": "Dale", "last": "Murphy", "age": 44},
{"first": "Roger", "last": "Craig", "age": 68},
{"first": "Jane", "last": "Murphy", "age": 47}
]
}
查询示例:
"name.last" >> "Anderson"
"age" >> 37
"children.#" >> 3
"children.1" >> "Alex"
"friends.#.first" >> ["Dale","Roger","Jane"]
"friends.1.last" >> "Craig"
查询数组中的对象
name := gjson.Get(json, `friends.#(last="Murphy").first`)
println(name.String()) // 输出: Dale
遍历数组或对象
result := gjson.Get(json, "friends")
result.ForEach(func(key, value gjson.Result) bool {
println(value.String())
return true // 继续迭代
})
高级功能
修饰符和路径链
// 反转数组
result := gjson.Get(json, "children|@reverse")
println(result.String()) // 输出: ["Jack","Alex","Sara"]
// 自定义修饰符
gjson.AddModifier("case", func(json, arg string) string {
if arg == "upper" {
return strings.ToUpper(json)
}
return json
})
value := gjson.Get(json, "children|@case:upper")
println(value.String()) // 输出: ["SARA","ALEX","JACK"]
处理JSON行
{"name": "Gilbert", "age": 61}
{"name": "Alexa", "age": 34}
{"name": "May", "age": 57}
// 使用..前缀处理JSON行
count := gjson.Get(json, "..#") // 获取行数
names := gjson.Get(json, "..#.name") // 获取所有name
gjson.ForEachLine(json, func(line gjson.Result) bool{
println(line.String())
return true
})
性能
GJSON性能优异,以下是基准测试结果:
BenchmarkGJSONGet-10 17893731 202.1 ns/op 0 B/op 0 allocs/op
BenchmarkJSONUnmarshalMap-10 832236 4279 ns/op 2920 B/op 68 allocs/op
BenchmarkJSONParserGet-10 13707510 263.9 ns/op 21 B/op 0 allocs/op
GJSON是一个高效、易用的JSON解析库,特别适合只需要提取JSON中特定值的场景。
更多关于golang一行代码快速获取JSON值插件库GJSON的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang一行代码快速获取JSON值插件库GJSON的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
GJSON - 快速获取JSON值的Golang库
GJSON是一个高性能的Go语言库,用于快速从JSON文档中提取值而无需解析整个文档。它提供了一种简洁的方式来查询JSON数据,特别适合处理大型JSON文档或只需要提取少量值的情况。
基本用法
安装
go get github.com/tidwall/gjson
示例代码
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
// 示例JSON数据
json := `{
"name": {"first": "Tom", "last": "Anderson"},
"age": 37,
"children": ["Sara", "Alex", "Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"first": "Dale", "last": "Murphy", "age": 44},
{"first": "Roger", "last": "Craig", "age": 68},
{"first": "Jane", "last": "Murphy", "age": 47}
]
}`
// 一行代码获取值
value := gjson.Get(json, "name.last")
fmt.Println(value.String()) // 输出: Anderson
// 获取嵌套值
age := gjson.Get(json, "friends.1.age")
fmt.Println(age.Int()) // 输出: 68
// 获取数组元素
child := gjson.Get(json, "children.2")
fmt.Println(child.String()) // 输出: Jack
// 使用通配符匹配多个值
results := gjson.Get(json, "friends.#.last")
for _, name := range results.Array() {
fmt.Println(name.String())
}
// 输出:
// Murphy
// Craig
// Murphy
// 条件查询
result := gjson.Get(json, `friends.#(last="Murphy").first`)
fmt.Println(result.String()) // 输出: Dale
// 获取不存在的字段
missing := gjson.Get(json, "address.city")
fmt.Println(missing.Exists()) // 输出: false
}
高级特性
1. 路径语法
GJSON使用简单的路径语法来查询JSON:
.
表示子级 (如name.last
)#
表示数组长度 (如friends.#
)#
在查询中表示数组索引 (如friends.#.last
)?
用于条件查询 (如friends.#(age>45).last
)
2. 多路径查询
// 一次查询多个路径
result := gjson.GetMany(json, "name.first", "name.last", "age")
first := result[0]
last := result[1]
age := result[2]
3. 修改JSON
GJSON主要用于查询,但也可以结合SJSON进行修改:
import "github.com/tidwall/sjson"
// 修改JSON
json, _ = sjson.Set(json, "name.last", "Smith")
4. 性能优化
对于需要多次查询同一JSON的情况,可以解析一次后复用:
// 解析一次,多次查询
parsed := gjson.Parse(json)
name := parsed.Get("name.first")
age := parsed.Get("age")
为什么选择GJSON
- 高性能: 只解析需要的部分,不解析整个JSON
- 简单API: 一行代码即可获取值
- 强大的查询语法: 支持条件查询、通配符等
- 零依赖: 纯Go实现,无外部依赖
- 流式处理: 可以处理非常大的JSON文档
注意事项
- GJSON是只读的,如需修改JSON需要配合SJSON使用
- 对于需要频繁访问整个JSON的场景,标准库的
encoding/json
可能更合适 - 路径查询是大小写敏感的
GJSON特别适合以下场景:
- 只需要从大型JSON中提取少量值
- 处理无法完全加载到内存的超大JSON文件
- 需要快速原型开发,不想定义完整结构体的情况