跳到主要内容

JSONPath 速查

JSONPath 用路径表达式选择 JSON 中的值。RFC 9535 定义了标准语法,但不少旧库和 kubectl 使用自己的变体,表达式应在实际实现中验证。

基本路径​

表达式含义
$文档根
$.service.name对象字段
$['service']['name']同一查询的括号写法
$['a-b']名称含特殊字符的字段
$.items[0] / $.items[-1]第一个 / 最后一个元素
$.items[*]所有元素
$.items[1:3]下标 1 到 2
$.items[0,2]选择指定下标
$..name递归查找名为 name 的成员
@过滤表达式中的当前候选值

过滤示例​

{
"items": [
{"name": "api", "port": 8080, "enabled": true},
{"name": "worker", "port": 9090, "enabled": false}
]
}
表达式匹配结果中的值
$.items[*].nameapi、worker
$.items[?(@.enabled == true)].nameapi
$.items[?(@.port >= 9000)].nameworker
$.items[?(@.port)]两个对象,因为都存在 port 成员
$.items[?(@.enabled == true && @.port == 8080)].nameapi

存在性测试不等于真值测试:[?(@.enabled)] 选择有这个成员的对象,即使值是 false。返回值可能是节点列表、值数组或带路径的记录,取决于调用接口。

标准与实现差异​

RFC 9535提供 length()、count()、match()、search()、value() 等过滤函数。=~ /regex/、路径末尾的 .sum() 等写法属于某些实现的扩展,不能作为标准通用语法。

需要构造新对象、聚合或输出 CSV 时可用 jq。JSONPath 主要用于选择,不要把 JMESPath 的对象投影语法混入其中。

kubectl 中的 JSONPath​

kubectl get pods -o jsonpath='{.items[*].metadata.name}'
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'

kubectl 允许省略根标记,并提供 range/end 模板结构;这不是 RFC 9535 的通用语法。需要跨工具迁移时参考目标库文档。kubectl 速查提供其他输出方法。

来源与许可​

本页由 Jacob’s Wiki 于 2026-11-05 对 IT-Tools 原文作中文摘译、重组和补充,保留常用操作,并非逐行全译。原文归 IT-Tools 项目贡献者所有。

本页译文与改编内容按 GNU GPL 3.0 提供,不附带担保;本站 Markdown 源码可用于修改和再分发。

原文另注明作者 mackoj。

返回开发运维速查目录