jsonpath - 通过表达式解析 JSON

JSONPath 之于 JSON,就如 XPath 之于 XML。JSONPath 可以方便对 JSON 数据结构进行内容提取。[1]

根对象使用 $ 来表示,而无需区分是对象还是数组。

表达式可以使用 .,也可以使用 []。如:

$.store.book[0].title$['store']['book'][0]['title']

表达式 (<expr>) 可用作显式名称或索引的替代,如:

$.store.book[(@.length-1)].title 表示获取最后一个 booktitle

使用符号 @ 表示当前对象。过滤器表达式通过语法支持,?(<boolean expr>) 如:

$.store.book[?(@.price < 10)].title 表示获取价格小于 10 的所有 booktitle

要点

  • $ 表示文档的根元素
  • @ 表示文档的当前元素
  • .node_name['node_name'] 匹配下级节点
  • [index] 检索数组中的元素
  • [start:end:step] 支持数组切片语法
  • * 作为通配符,匹配所有成员
  • .. 子递归通配符,匹配成员的所有子元素
  • (<expr>) 使用表达式
  • ?(<boolean expr>) 进行数据筛选

JsonPath 是一种用于从 JSON 数据中提取信息的语言。它类似于 XPath,但是专门用于 JSON 数据。以下是 JsonPath 的语法:

  • $:表示根节点。
  • @:表示当前节点。
  • .:表示子节点。
  • ..:表示子孙节点。
  • *:表示通配符,匹配任意节点。
  • []:表示索引,可以匹配数组中的元素或对象中的属性。
  • [,]:表示多索引,可以同时匹配多个索引。
  • [:n]:表示从第一个元素开始到第 n 个元素。
  • [-n:]:表示从倒数第 n 个元素开始到最后一个元素。
  • [start:end:step]:表示从第 start 个元素开始到第 end 个元素,步长为 step。

下面是几个示例:

假设我们有以下 JSON 数据:

{
  "store": {
    "book": [
      {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      {
        "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      {
        "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
  • $:表示整个 JSON 数据。
{
  "store": {
    "book": [
      {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      {
        "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      {
        "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
  • $.store:表示 store 对象。
{
  "book": [
    {
      "category": "reference",
      "author": "Nigel Rees",
      "title": "Sayings of the Century",
      "price": 8.95
    },
    {
      "category": "fiction",
      "author": "Evelyn Waugh",
      "title": "Sword of Honour",
      "price": 12.99
    },
    {
      "category": "fiction",
      "author": "Herman Melville",
      "title": "Moby Dick",
      "isbn": "0-553-21311-3",
      "price": 8.99
    },
    {
      "category": "fiction",
      "author": "J. R. R. Tolkien",
      "title": "The Lord of the Rings",
      "isbn": "0-395-19395-8",
      "price": 22.99
    }
  ],
  "bicycle": {
    "color": "red",
    "price": 19.95
  }
}
  • $.store.book[*]:表示所有书籍。
[
  {
    "category": "reference",
    "author": "Nigel Rees",
    "title": "Sayings of the Century",
    "price": 8.95
  },
  {
    "category": "fiction",
    "author": "Evelyn Waugh",
    "title": "Sword of Honour",
    "price": 12.99
  },
  {
    "category": "fiction",
    "author": "Herman Melville",
    "title": "Moby Dick",
    "isbn": "0-553-21311-3",
    "price": 8.99
  },
  {
    "category": "fiction",
    "author": "J. R. R. Tolkien",
    "title": "The Lord of the Rings",
    "isbn": "0-395-19395-8",
    "price": 22.99
  }
]
  • $.store.book[2]:表示第三本书(索引从 0 开始)。
{
  "category": "fiction",
  "author": "Herman Melville",
  "title": "Moby Dick",
  "isbn": "0-553-21311-3",
  "price": 8.99
}
  • $.store.book[-2:]:表示最后两本书。
[
  {
    "category": "fiction",
    "author": "Herman Melville",
    "title": "Moby Dick",
    "isbn": "0-553-21311-3",
    "price": 8.99
  },
  {
    "category": "fiction",
    "author": "J. R. R. Tolkien",
    "title": "The Lord of the Rings",
    "isbn": "0-395-19395-8",
    "price": 22.99
  }
]
  • $.store.book[0,2]:表示第一本和第三本书。
[
  {
    "category": "reference",
    "author": "Nigel Rees",
    "title": "Sayings of the Century",
    "price": 8.95
  },
  {
    "category": "fiction",
    "author": "Herman Melville",
    "title": "Moby Dick",
    "isbn": "0-553-21311-3",
    "price": 8.99
  }
]
  • $.store.book[0:2]:表示前两本书。
[
  {
    "category": "reference",
    "author": "Nigel Rees",
    "title": "Sayings of the Century",
    "price": 8.95
  },
  {
    "category": "fiction",
    "author": "Evelyn Waugh",
    "title": "Sword of Honour",
    "price": 12.99
  }
]
  • $.store.book[-2:].title:表示最后两本书的标题。
[
  "Moby Dick",
  "The Lord of the Rings"
]
  • $.store..price:表示所有价格。
[
  8.95,
  12.99,
  8.99,
  22.99,
  19.95
]
  • $..book[?(@.price<10)]:表示价格小于 10 的所有书籍。
[
  {
    "category": "reference",
    "author": "Nigel Rees",
    "title": "Sayings of the Century",
    "price": 8.95
  },
  {
    "category": "fiction",
    "author": "Herman Melville",
    "title": "Moby Dick",
    "isbn": "0-553-21311-3",
    "price": 8.99
  }
]

以上就是 JsonPath 的语法和示例说明。


  1. https://apifox.com/help/reference/json-path/在新窗口打开 ↩︎