深入解析GJSON路径语法:高效查询JSON数据的利器
gjson Get JSON values quickly - JSON parser for Go 项目地址: https://gitcode.com/gh_mirrors/gj/gjson
GJSON是一个强大的Go语言JSON解析库,其核心特性之一就是提供了一套简洁高效的路径查询语法。本文将全面解析GJSON路径语法,帮助开发者掌握这一高效查询JSON数据的工具。
什么是GJSON路径语法
GJSON路径语法是一种文本字符串表达式,专门设计用于快速从JSON负载中检索值。它类似于XPath对XML的作用,但更加简洁直观,特别适合处理复杂的JSON数据结构。
基础路径查询
最基本的GJSON路径由一系列用点号(.)分隔的组件组成,每个组件对应JSON中的一个层级。
{
"name": {"first": "Tom", "last": "Anderson"},
"age": 37,
"children": ["Sara","Alex","Jack"]
}
对应的查询示例:
name.last // 返回 "Anderson"
age // 返回 37
children.1 // 返回 "Alex" (数组索引从0开始)
高级查询特性
通配符查询
GJSON支持两种通配符:
*
:匹配任意多个字符?
:匹配单个字符
child*.2 // 匹配"children"并返回第三个元素 "Jack"
c?ildren.0 // 匹配"children"并返回第一个元素 "Sara"
转义特殊字符
当键名中包含特殊字符时,可以使用反斜杠()进行转义:
fav\.movie // 返回 "Deer Hunter"
在Go代码中需要注意转义处理:
val := gjson.Get(json, "fav\\.movie") // 需要转义反斜杠
val := gjson.Get(json, `fav\.movie`) // 原始字符串无需转义
数组操作
#
符号用于处理数组:
#
单独使用:获取数组长度#.key
:获取数组中所有元素的指定属性
friends.# // 返回 3 (数组长度)
friends.#.age // 返回 [44,68,47] (所有朋友的年龄)
条件查询
GJSON提供了强大的条件查询功能,支持多种比较运算符:
// 基本比较
friends.#(last=="Murphy").first // 返回 "Dale"
friends.#(age>45)#.last // 返回 ["Craig","Murphy"]
// 模式匹配
friends.#(first%"D*").last // 返回 "Murphy" (D开头)
friends.#(first!%"D*").last // 返回 "Craig" (非D开头)
// 嵌套查询
friends.#(nets.#(=="fb"))#.first // 返回 ["Dale","Roger"]
特殊比较运算符
~
运算符用于特殊类型的比较:
~true
:将真值转换为true~false
:将假值或不存在值转换为true~null
:将null或不存在值转换为true~*
:将任何存在的值转换为true
vals.#(b==~true)#.a // 返回所有真值的a属性
vals.#(b==~false)#.a // 返回所有假值或不存在的a属性
路径分隔符:点号与竖线
GJSON支持两种路径分隔符:
.
:标准分隔符|
:特殊分隔符,在处理数组和查询时有不同行为
主要区别在于处理时机:
.
在查询过程中处理每个组件|
在获取前一个结果后再处理下一个组件
friends.#(last="Murphy")#.first // 返回 ["Dale","Jane"]
friends.#(last="Murphy")#|first // 返回空(因为前一个结果是数组)
修饰符功能
修饰符是GJSON的强大特性,可以对查询结果进行额外处理:
内置修饰符
children.@reverse // 反转数组 ["Jack","Alex","Sara"]
children.@reverse.0 // 返回 "Jack"
friends.@pretty // 美化输出JSON
friends.@keys // 返回所有键名 ["first","last","age","nets"]
自定义修饰符
开发者可以注册自己的修饰符:
gjson.AddModifier("case", func(json, arg string) string {
if arg == "upper" {
return strings.ToUpper(json)
}
if arg == "lower" {
return strings.ToLower(json)
}
return json
})
"name.first.@case:upper" // 返回 "TOM"
多路径查询
GJSON允许组合多个路径来构建新的JSON文档:
{name.first,age,"the_murphys":friends.#(last="Murphy")#.first}
返回结果:
{
"first": "Tom",
"age": 37,
"the_murphys": ["Dale","Jane"]
}
JSON字面量
从v1.12.0开始,GJSON支持JSON字面量,便于构建静态JSON块:
{name.first,age,"company":!"Happysoft","employed":!true}
返回结果:
{
"first": "Tom",
"age": 37,
"company": "Happysoft",
"employed": true
}
最佳实践建议
- 对于简单查询,直接使用点号分隔的路径
- 处理复杂数据结构时,合理利用条件查询和嵌套查询
- 需要格式化输出时使用修饰符
- 构建新JSON文档考虑使用多路径查询
- 注意特殊字符的转义处理
通过掌握GJSON路径语法,开发者可以高效地从复杂JSON结构中提取所需数据,大大提升开发效率。
gjson Get JSON values quickly - JSON parser for Go 项目地址: https://gitcode.com/gh_mirrors/gj/gjson
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考