JSONPath - XPath for JSON(JMeter中的 json path espressions语法参考)

本文深入介绍了JSONPath,一种用于从JSON文档中提取数据的强大工具,类似于XML的XPath。文章对比了JSONPath与XPath的不同之处,提供了丰富的示例说明如何使用JSONPath表达式定位和筛选JSON数据。
摘要由CSDN通过智能技术生成

JSONPath介绍(JSONPath - XPath for JSON),JMeter中的 json path espressions参考语法,仅供参考。

本文为原文通过结合google、百度的翻译版本,如果有歧义,请参考原文https://goessner.net/articles/JsonPath/ 

 

 JSONPath-JSON的XPath

XML的一个经常强调的优点是可以使用大量工具来分析,转换和有选择地从XML文档中提取数据。XPath是这些功能强大的工具之一。

是时候考虑一下,是否需要像XPath4JSON这样的东西,以及它可以解决哪些问题。

  • 可以在客户端上以交互方式从JSON结构中找到数据并提取数据,而无需使用特殊脚本。
  • 可以将客户端请求的JSON数据简化为服务器上的相关部分,从而最大程度地减少服务器响应的带宽使用量。

如果我们同意,那么从手头的JSON结构中挑选部分的工具确实有意义,就会出现一些问题。它应该怎么做?JSONPath表达式看起来怎么样?

由于JSON是C族编程语言中数据的自然表示,因此特定语言具有访问JSON结构的本地语法元素的可能性很高。

以下XPath表达式

/store/book[1]/title

看起来像

x.store.book[0].title

要么

x['store']['book'][0]['title']

在Javascript,Python和PHP中,带有x保存JSON结构的变量。在这里,我们观察到,特定语言通常已经内置了基本的XPath功能。

有问题的JSONPath工具应…

  • 自然地基于那些语言特征。
  • 仅涵盖XPath 1.0的基本部分。
  • 代码大小和内存消耗轻巧。
  • 运行时高效。

 

 JSONPath表达式

JSONPath表达式引用JSON结构的方式与XPath表达式与XML文档结合使用的方式相同。由于JSON结构通常是匿名的,不一定有“根成员对象”,因此JSONPath假定为外层对象分配了抽象名称$。

JSONPath表达式可以使用点号-表示法

$.store.book[0].title

括号符号

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

输入路径。内部路径或输出路径将始终转换为更通用的括号-表示法。

JSONPath允许通配符 *表示成员名称和数组索引。它从E4X借用后代运算符'..' 和从ECMASCRIPT 4借用数组切片语法建议。[start:end:step]

底层脚本语言的表达式(<expr>)可以用作显式名称或索引的替代,例如

$.store.book[(@.length-1)].title

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

$.store.book[?(@.price < 10)].title

这是JSONPath语法元素与其XPath对应元素的完整概述和并排比较。

XPathJSONPath描述
/$根对象/元素
@当前的对象/元素
/. or []子运算符
..n/a父运算符
//..递归下降。JSONPath从E4X借用此语法。
**通配符。所有对象/元素,无论其名称如何。
@n/a属性访问。JSON结构没有属性。
[][]下标运算符。XPath使用它来遍历元素集合和谓词。在Javascript和JSON中,它是本机数组运算符。
|[,]XPath中的Union运算符导致节点集的组合。JSONPath允许将备用名称或数组索引作为一组。
n/a[start:end:step]从ES4借用的数组分片运算符。
[]?()应用过滤器(脚本)表达式。
n/a()脚本表达式,使用基础脚本引擎。
()n/a在Xpath中分组

XPath提供的功能(此处未缩写的语法,运算符和函数的位置路径)比此处列出的要多得多。而且,下标运算符在Xpath和JSONPath中的工作方式存在显着差异。

  • XPath表达式中的方括号始终作用于由先前路径片段产生的节点集。索引始终以1开始。
  • 使用JSONPath时,方括号可用于上一个路径片段所寻址的对象数组。索引始终以0开头。

 

 JSONPath示例

让我们通过更多示例来练习JSONPath表达式。我们从在代表书店的XML示例(原始XML文件)之后构建的简单JSON结构开始。

{ “ store”:{
     “ book”:[
      { “ category”:“参考”,
         “ author”:“ Nigel Rees”,
         “ title”:“世纪风俗”,
         “ price”:8.95
      },
      { “ category”:“小说”,
         “ author”:“ Evelyn Waugh”,
         “ title”:“荣誉剑”,
         “ price”:12.99
      },
      { “ category”:“小说”,
         “ author”:“ Herman Melville”,
         “ title”:“ Moby Dick”,
         “ isbn”:“ 0-553-21311-3”,
         “ price”:8.99
      },
      { “ category”:“小说”,
         “ author”:“ JRR Tolkien”,
         “ title”:“指环王”,
         “ isbn”:“ 0-395-19395-8”,
         “ price”:22.99
      }
    ],
    “ bicycle”:{
       “ color”:“ red”,
       “ price”:19.95
    }
  }
}
XPathJSONPath结果
/store/book/author$.store.book[*].author商店中所有书籍的作者
//author$..author所有作者
/store/*$.store.*商店里所有的东西,包括一些书和一辆红色的自行车。
/store//price$.store..price商店中所有商品的价格。
//book[3]$..book[2]第三本书
//book[last()]$..book[(@.length-1)]
$..book[-1:]
最后一本书。
//book[position()<3]$..book[0,1]
$..book[:2]
前两本书
//book[isbn]$..book[?(@.isbn)]过滤所有带有isbn号的书
//book[price<10]$..book[?(@.price<10)]筛选所有价格低于10的书籍
//*$..*XML文档中的所有元素。JSON结构的所有成员。

 

 JSONPath实现

JSONPath在Javascript中实现,供客户端使用,并移植到PHP以在服务器上使用。

用法

您所需要做的就是下载其中一个文件

将其包含在您的程序中,并使用由一个功能组成的简单API。

jsonPath(obj, expr [, args])

参数:

obj (object|array)

表示JSON结构的对象。

expr (string)

JSONPath表达式字符串。

args (object|undefined)

对象控制路径评估和输出。当前仅支持一个成员。

args.resultType ("VALUE"|"PATH")

导致结果要么是匹配值(默认值),要么是规范化的路径表达式。

返回值:

(array|false)

包含与输入路径表达式匹配的值或规范化路径表达式的数组,可用于延迟求值。false如果没有匹配。

JavaScript示例

VAR O = { /*...*/ },   //在'存储'从上面JSON对象 
    RES1 = jsonPath(邻,“$ ..作者”).toJSONString(),
    res2 = jsonPath(o,“ $ .. author”,{resultType:“ PATH” })。toJSONString();

PHP示例

我们需要首先将JSON字符串转换为PHP数组。我为此使用Michal MigurskiJSON解析器

require_once('json.php');      // JSON解析器 
require_once('jsonpath.php');  // JSONPath评估器

$ json = '{...}' ;  //上面的JSON结构

$ parser = 新的 Services_JSON(SERVICES_JSON_LOOSE_TYPE);
$ o = $ parser-> decode($ json);
$ match1 = jsonPath($ o,“ $ .. author”);
$ match2 = jsonPath($ o,“ $ .. author”,array(“ resultType” => “ PATH”));
$ res1 = $ parser-> encode($ match1);
$ res2 = $ parser-> encode($ match2);

结果

两者的JavascriptPHP示例结果在下面的JSON阵列(字符串):

RES1:
[ “奈杰尔里斯(Nigel Rees),
   ”伊芙琳沃(Evelyn Waugh)“,
   ”赫尔曼·梅尔维尔(Herman Melville)“,
   ” JRR托尔金(JRR Tolkien)“
]
RES2:
[ “ $ ['store'] ['book'] [0] ['author']”,
   “ $ ['store'] ['book'] [1] ['author']”,
   “ $ ['store '] ['book'] [2] ['author']“,
   ” $ ['store'] ['book'] [3] ['author']“ 
]

请注意,的返回值jsonPath是一个数组,也是一个有效的JSON结构。因此,您可能想再次应用于jsonPath结果结构,或者像sort使用它一样使用自己喜欢的数组方法之一。

 

 问题

  • 当前,JSONPath表达式中仅允许使用单引号。
  • JSONPath位置内的脚本表达式当前未由递归求值jsonPath。一个简单的正则表达式仅扩展全局$和局部@符号。
  • 的替代jsonPath,以返回false在的情况下,不匹配可以是在将来返回一个空数组。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值