JSONPath

工具介绍

JSONPath是一种用于从JSON(JavaScript Object Notation)数据中提取和操作数据的查询语言。它的设计灵感来自于XML的XPath,但专门用于JSON数据结构。

JSONPath使用美元符号($)表示JSON文档的根元素,然后使用点号(.)或方括号([])来访问子元素。

 

主要语法

  • $ : 根对象
  • @ : 当前节点
  • * : 通配符,表示所有对象或元素
  • . : 子元素
  • .. : 递归下降。必要时在任何地方可以使用名称
  • [] : 子元素或数组索引
  • [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
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

 

JSONPath 表达式 说明
$.store.book[*].author 获取所有书籍的作者
$..author 获取文档中的所有作者
$.store.* 获取store下的所有内容
$.store..price 获取store中所有的价格
$..book[2] 获取第三本书(索引从0开始)
$..book[?(@.price<10)] 获取所有价格小于10的书
$..book[?(@.category=="fiction")] 获取所有分类为fiction的书
$..book[-1] 获取最后一本书
$..book[0,1] 获取前两本书
$..book[:2] 获取从索引0(包含)到索引2(不包含)的所有书
$..book[-2:] 获取最后两本书
$..book[?(@.isbn)] 获取所有有ISBN号的书
$.store.book[?(@.price > 10)] 获取store中所有价格大于10的书
$..book[?(@.author =~ /.*Smith/i)] 获取作者名字包含"Smith"的所有书(不区分大小写)
$..* 获取文档中的所有元素
$..book.length() 获取书籍的数量

 

应用场景

JSONPath在许多场景下非常有用,例如:

  • API测试:验证API返回的JSON数据
  • 数据提取:从大型JSON文档中提取特定信息
  • 配置管理:在复杂的配置文件中查找和修改特定值
  • 数据转换:将JSON数据转换为其他格式

 

实现

虽然JSONPath不是一个官方标准,但它在多种编程语言中都有实现,如JavaScript、Python、Java等。每种语言可能有略微不同的语法或额外的功能。

 

注意事项

  • JSONPath是只读的,不能用于修改JSON数据
  • 不同的JSONPath库可能有细微的语法差异
  • 在处理大型JSON文档时,可能会遇到性能问题,主要保留工作状态,以及处理异常