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

  1. 高性能: 只解析需要的部分,不解析整个JSON
  2. 简单API: 一行代码即可获取值
  3. 强大的查询语法: 支持条件查询、通配符等
  4. 零依赖: 纯Go实现,无外部依赖
  5. 流式处理: 可以处理非常大的JSON文档

注意事项

  • GJSON是只读的,如需修改JSON需要配合SJSON使用
  • 对于需要频繁访问整个JSON的场景,标准库的encoding/json可能更合适
  • 路径查询是大小写敏感的

GJSON特别适合以下场景:

  • 只需要从大型JSON中提取少量值
  • 处理无法完全加载到内存的超大JSON文件
  • 需要快速原型开发,不想定义完整结构体的情况
回到顶部