深入解析GJSON路径语法:高效查询JSON数据的利器

深入解析GJSON路径语法:高效查询JSON数据的利器

gjson Get JSON values quickly - JSON parser for Go gjson 项目地址: 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
}

最佳实践建议

  1. 对于简单查询,直接使用点号分隔的路径
  2. 处理复杂数据结构时,合理利用条件查询和嵌套查询
  3. 需要格式化输出时使用修饰符
  4. 构建新JSON文档考虑使用多路径查询
  5. 注意特殊字符的转义处理

通过掌握GJSON路径语法,开发者可以高效地从复杂JSON结构中提取所需数据,大大提升开发效率。

gjson Get JSON values quickly - JSON parser for Go gjson 项目地址: https://gitcode.com/gh_mirrors/gj/gjson

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡晗研

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值