什么是JSON PATH?

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
云数据库 PolarDB MySQL 版,列存表分析加速 8核16GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: **JSON Path 概述**JSON Path 是一种查询JSON对象的语言,类似于XML的XPath。在JavaScript或PostgreSQL中,它简化了深层属性的访问。在PG中,传统的链式引用操作符如`->`可能繁琐,而JSON Path通过字符串路径表达式提供更简洁的访问方式。例如,`$.track.segments[0].HR`来获取心率数据。SQL/JSON Path Language允许通过`jsonb_path_query`等函数执行路径查询,支持通配符、条件检查和参数化路径。

什么是JSON PATH

在一般的编程语言中,JSON对象中,深层次的对象和属性的访问,使用一种链式标识的方式,例如对于下面这个对象(来自PG官方技术文档):

js

代码解读

复制代码

{
  "track": {
    "segments": [
      {
        "location":   [ 47.763, 13.4034 ],
        "start time": "2018-10-14 10:05:14",
        "HR": 73
      },
      {
        "location":   [ 47.706, 13.2635 ],
        "start time": "2018-10-14 10:39:21",
        "HR": 135
      }
    ]
  }
}

在JS语言中,如果要访问其中的一个属性,可以使用下面的方法: track.segements[0].HR。但在Postgres的SQL语言中,由于语法的限制,可能需要使用"->"引用操作符,也是链式访问,如下:

sql

代码解读

复制代码

 with D (data) as (values ('{
  "track": {
    "segments": [
      {
        "location":   [ 47.763, 13.4034 ],
        "start time": "2018-10-14 10:05:14",
        "HR": 73
      },
      {
        "location":   [ 47.706, 13.2635 ],
        "start time": "2018-10-14 10:39:21",
        "HR": 135
      }
    ]
  }
}')) 

select D.data::jsonb->'track'->'segments'->0->>'HR' from D;
 ?column? 
----------
 73
(1 row)

可能觉得这种写法过于繁复,PG的设计者提出了一种“路径”查询的方式,就是通过一种形式,可以定义一个寻址的路径,然后基于这个路径来解析和访问JSON对象,得到需要的结果。 这个路径,可以简单的使用一个字符串来进行表达,容易构造和使用。

这个路径,就是所谓的JSON PATH,而用来表示和描述这个路径所使用的语言,就是规范化的字符串,则被称为 SQL/JSON Path Language,即JSON路径语言。

SQL/JSON PATH语言如何使用

还是使用上面那个例子,如果使用路径语言来实现,可以使用下面的方式:

sql

代码解读

复制代码

-- 查询属性
select jsonb_path_query(data::jsonb, '$.track.segments') from D;
                                                                         jsonb_path_query                                                                          
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
 [{"HR": 73, "location": [47.763, 13.4034], "start time": "2018-10-14 10:05:14"}, {"HR": 135, "location": [47.706, 13.2635], "start time": "2018-10-14 10:39:21"}]
(1 row)

-- 指定位置和属性
select jsonb_path_query(data::jsonb, '$.track.segments[0].location') from D;
 jsonb_path_query  
-------------------
 [47.763, 13.4034]
(1 row)

-- 通配符
select jsonb_path_query(data::jsonb, '$.track.segments[*].location') from D;
 jsonb_path_query  
-------------------
 [47.763, 13.4034]
 [47.706, 13.2635]
(2 rows)

-- 不存在的路径 
select jsonb_path_query(data::jsonb, '$.track.segments[3].location') from D;
 jsonb_path_query 
------------------
(0 rows)

-- 条件检查
select jsonb_path_query(data::jsonb, '$.track.segments[*] ? (@.HR > 130)."start time"') from D;
   jsonb_path_query    
-----------------------
 "2018-10-14 10:39:21"
(1 row)


从这些例子中,我们可以看到,JSON Path一般结合匹配的函数或者操作符使用,这时可以将其看成简单的字符串参数。然后由数据库引擎来解析这个字符串,并进行相关的处理。

JSON Path的主要语法规则是什么样的

根据对上面例子和技术资料的解读,笔者总结了一下JSON Path的主要语法规则

  • 所有JSON Path,都是一个字符串,使用''包围起来
  • 一般使用$开始,代表当前处理的JSON对象
  • 类似于JS的语法,使用.和中括号,结合属性名称来表示寻址路径
  • 寻址的次序,从左到右进行解析
  • 属性名称中有空格的,可以使用双引号包围
  • 对于数组,可以使用通配符 *,或者具体数字
  • 可以使用条件语句,来对属性进行过滤
  • 条件语句中,使用@表示当前引用的属性值,并使用 ? 作为操作符

PG中关于JSON PATH有那些相关的功能和函数

在JSON章节中,我们已经提到,下面由两个操作符,需要配合JSON Path进行使用:

  • jsonb @? jsonpath → boolean

用于检查是否有匹配JSON Path的项目(可以返回记录)。

  • jsonb @@ jsonpath → boolean

对JSON对象,使用JSON Path进行谓词检查,只计算第一个匹配项目。和前面项目的区别是,需要使用一个检查机制,如指定一个条件,来对枚举的项目进行检查,而前者则是通过返回的记录来确定。需要注意,如果检查的项目本身为null,则会返回null,而不是布尔值。

PG中,还有有一类使用json_path开头的函数,一般都和JSON Path语言的应用相关,例如:

  • jsonb_path_exists ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

这个方法非常基本,就是用于检查在JSON对象中,路径查询的结果是否存在。在路径字符串中,还可以定义参数,并可以使用在vars对象中的值来替换(也就是说path也可以是参数化的);silent参数为true时,函数将抑制与@?和@@运算符相同的错误(这个设置,笔者没有完全理解,大致是条件抛出错误而非返回空值的意思)。

  • jsonb_path_query ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → setof jsonb

这个方法是实际应用中最常见的,就是使用路径进行查询并获得匹配的结果。下面有一个简单的例子:

sql

代码解读

复制代码

select id, 
jsonb_path_exists(data::jsonb, '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}') j1, 
jsonb_path_query(data::jsonb, '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":5}') j2 
from lateral ( values (1001,'{"a":[1,2,3,4,5]}'),(1002,'{"a":[5,6,7,8]}')) as D(id,data);
  id  | j1 | j2 
------+----+----
 1001 | t  | 2
 1001 | t  | 3
 1001 | t  | 4
 1001 | t  | 5
 1002 | f  | 5
(5 rows)

从这个例子我们可以看到:

exists,返回的是一个布尔值;query,根据查询路径不同,可能返回的结果也有差异,例子中返回的是一个匹配条件的记录集;例子中使用了一个参数化的路径,并传输了要使用的参数对象;参数化查询,大大提高了JSON路径查询构建和执行的灵活性

  • jsonb_path_match ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

需要使用一个检查性的JSON Path语句,返回匹配检查的结果。例如:

jsonb_path_match('{"a":[1,2,3,4,5]}', 'exists(.a[∗]?(@>=.a[*] ? (@ >= .a[]?(@>=min && @ <= $max))', '{"min":2, "max":4}') → t

注意其中的exists判断,笔者没有找到其他的例子和写法。在这一点,math好像和exists是一样的。

  • jsonb_path_query_array, jsonb_path_query_first

这两个函数和path_query类似,只不过如果是数组的话,它会返回一个数组而不是记录集;query_first显然就是返回数组中第一个值(不是数��,也不是记录集)。

  • jsonb_path_exists_tz,jsonb_path_match_tz,jsonb_path_query_tz,jsonb_path_query_array_tz,jsonb_path_query_first_tz

这里的tz,是TimeZone(时区的意思)。也就是说,这些方法的基本功能都是和前面的方法差不多的,但如果包括时间相关处理的话,都要考虑时区的信息。

小结

本文讨论了Postgres JSON功能的一个扩展性的特性,就是JSON Path。表述了笔者对其的理解,应用的方式和场合,以及Postgres中,相关的操作符和函数,和使用方式等等内容。



相关文章
|
3月前
|
弹性计算 人工智能 API
零基础保姆级教程:阿里云ECS部署OpenClaw(Clawdbot) + 百炼API配置 + Skills集成全攻略
在AI Agent技术飞速迭代的2026年,OpenClaw(原Clawdbot、Moltbot)凭借开源可控、部署灵活、技能可扩展的核心优势,成为个人办公、轻量团队协作的首选自动化工具。截至2026年3月,其GitHub星标数量已突破18.8万,Fork数超3.3万,Discord社区在线成员超1.2万名,核心贡献者达140余人,成为年度最热门的开源AI Agent项目之一。很多新手对“OpenClaw”与“Clawdbot”的关系存在困惑,实则二者本质完全一致——Clawdbot是OpenClaw的旧称,2026年1月因商标优化正式更名,核心功能、技术架构、部署流程毫无变化,老用户沿用的
664 2
|
JSON JavaScript 前端开发
Python中使用JsonPath:概念、使用方法与案例
Python中使用JsonPath:概念、使用方法与案例
916 0
|
2月前
|
人工智能 JavaScript Linux
告别Token烧钱!OpenClaw 1分钟阿里云+本地部署与免费大模型API配置实战完整教程
2026年,OpenClaw(曾用名Clawdbot、Moltbot,昵称大龙虾)已成为面向个人与小型团队的主流AI代理平台,可集成多类大模型、支持多IM渠道接入、实现自动化任务与长上下文对话。但在实际使用中,不少用户仍面临部署复杂、环境依赖混乱、Token消耗过快、API对接失败等问题。本文基于2026年最新规范,完整覆盖阿里云轻量服务器一键部署、Windows11/MacOS/Linux本地部署、阿里云百炼千问大模型API与Coding Plan配置,并整理高频问题与稳定运行方案,全程可直接复制命令执行,无额外技术门槛,帮助用户快速搭建稳定、低成本、全天候在线的AI助手。
632 0
|
10月前
|
人工智能 自然语言处理 机器人
智能体平台哪家值得选?盘点国内外12家AI Agent平台技术特色
智能体平台正引领人机协作新潮流,将“智能”交给机器,让“平台”服务于人。2024年被Gartner定义为“AgenticAI元年”,预示未来企业交互将由智能体主导。面对百余平台,可从三条赛道入手:通用大模型、RPA升级派与垂直场景定制。不同需求对应不同方案,选对平台,才能让AI真正助力工作。
4219 1
FW怎么做立体箭头? fireworks三维立体箭头的制作方法
我们在FW绘制图形时,有时候经常需要用到立体的效果。该怎么回执箭头并添加立体效果呢?下面我们就来看看详细的教程。
525 1
FW怎么做立体箭头? fireworks三维立体箭头的制作方法
|
JSON Java 测试技术
jsonpath :从入门到精通
jsonpath :从入门到精通
|
存储 监控 虚拟化
Hyper V上网优化:提升虚拟机网络速度
要优化Hyper-V虚拟机的网络速度,可从以下几方面入手:1. 优化虚拟交换机配置,如选择合适的交换机类型、启用SR-IOV、配置VLAN和QoS策略;2. 调整网络适配器设置,选择适当的适配器类型并启用VRQ等;3. 优化宿主机网络配置,更新网卡固件和驱动,启用硬件加速;4. 使用性能监视工具监控网络流量;5. 其他措施如启用硬件虚拟化、使用外部存储、配置NLB等。通过合理配置,可显著提升网络性能。
1636 17
|
C语言
【C语言】头文件命名详解 - 《铁头无敌 ! 》
头文件在C语言编程中起着组织代码和提高代码复用性的作用。标准头文件提供了丰富的库函数,而自定义头文件可以将常用函数、宏定义、类型定义等封装起来,以便在多个源文件中共享。遵循良好的头文件命名和使用约定,有助于编写清晰、易维护的C语言程序。
550 3
|
消息中间件 监控 Java
【Kafka节点存活大揭秘】如何让Kafka集群时刻保持“心跳”?探索Broker、Producer和Consumer的生死关头!
【8月更文挑战第24天】在分布式系统如Apache Kafka中,确保节点的健康运行至关重要。Kafka通过Broker、Producer及Consumer间的交互实现这一目标。文章介绍Kafka如何监测节点活性,包括心跳机制、会话超时与故障转移策略。示例Java代码展示了Producer如何通过定期发送心跳维持与Broker的连接。合理配置这些机制能有效保障Kafka集群的稳定与高效运行。
728 2
|
消息中间件 存储 负载均衡
RocketMQ 消息的顺序和重复
这篇文章探讨了RocketMQ中消息顺序和重复的问题,解释了为什么RocketMQ不保证消息顺序和不重复,并提供了解决这些问题的策略,包括消费端幂等性处理和使用日志表记录已处理消息ID,同时介绍了RocketMQ的事务消息、Producer和Consumer的最佳实践,以及其他配置和RocketMQ的基本概念。
727 0
RocketMQ 消息的顺序和重复