JSON JSONPath
JSONPath is a query language for JSON, similar to XPath for XML. AlertSite API endpoint monitors let you use JSONPath in assertions to specify the JSON fields that need to be verified.
JSONPath Notation
A JSONPath expression specifies a path to an element (or a set of elements) in a JSON structure. Paths can use the dot notation:
$.store.book[0].title
or the bracket notation:
$['store']['book'][0]['title']
The leading $ represents the root object or array and can be omitted. For example, $.foo.bar and foo.barare the same, and so are $[0].status and [0].status.
Other syntax elements are described below.
| Expression | Description |
|---|---|
$ |
The root object or array. |
.property |
Selects the specified property in a parent object. |
['property'] |
Selects the specified property in a parent object. Be sure to put single quotes around the property name. Tip: Use this notation if the property name contains special characters such as spaces, or begins with a character other than |
[n] |
Selects the n-th element from an array. Indexes are 0-based. |
[index1,index2,…] |
Selects array elements with the specified indexes. Returns a list. |
..property |
Recursive descent: Searches for the specified property name recursively and returns an array of all values with this property name. Always returns a list, even if just one property is found. |
* |
Wildcard selects all elements in an object or an array, regardless of their names or indexes. For example, |
[start:end][start:] |
Selects array elements from the start index and up to, but not including, end index. If end is omitted, selects all elements from start until the end of the array. Returns a list. |
[:n] |
Selects the first n elements of the array. Returns a list. |
[-n:] |
Selects the last n elements of the array. Returns a list. |
[?(expression)] |
Filter expression. Selects all elements in an object or array that match the specified filter. Returns a list. |
[(expression)] |
Script expressions can be used instead of explicit property names or indexes. An example is [(@.length-1)] which selects the last item in an array. Here, length refers to the length of the current array rather than a JSON field named length. |
@ |
Used in filter expressions to refer to the current node being processed. |
Notes:
JSONPath expressions, including property names and values, are case-sensitive.
Unlike XPath, JSONPath does not have operations for accessing parent or sibling nodes from the given node.
Filters
Filters are logical expressions used to filter arrays. An example of a JSONPath expression with a filter is
$.store.book[?(@.price < 10)]
where @ represents the current array item or object being processed. Filters can also use $ to refer to the properties outside of the current object:
$.store.book[?(@.price < $.expensive)]
An expression that specifies just a property name, such as [?(@.isbn)], matches all items that have this property, regardless of the value.
Additionally, filters support the following operators:
| Operator | Description |
|---|---|
== |
Equals to. 1 and '1' are considered equal. String values must be enclosed in single quotes (not double quotes): [?(@.color=='red')]. |
!= |
Not equal to. String values must be enclosed in single quotes. |
> |
Greater than. |
>= |
Greater than or equal to. |
< |
Less than. |
<= |
Less than or equal to. |
=~ |
Match a JavaScript regular expression. For example, Note: Not supported at locations that use Ready! API 1.1. |
! |
Use to negate a filter: Note: Not supported at locations that use Ready! API 1.1. |
&& |
Logical AND, used to combine multiple filter expressions:
[?(@.category=='fiction' && @.price < 10)] |
|| |
Logical OR, used to combine multiple filter expressions: [?(@.category=='fiction' || @.price < 10)] Note: Not supported at locations that use Ready! API 1.1. |
Examples
For these examples, we will use a modified version of JSON from http://goessner.net/articles/JsonPath/index.html#e3:
{
"store": {
"book": [
{
"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
},
{
"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
}
},
"expensive": 10
}
In all these examples, the leading $. is optional and can be omitted.
| Expression | Meaning |
|---|---|
$.store.* |
All direct properties of store (not recursive). |
$.store.bicycle.color |
The color of the bicycle in the store. Result: |
$.store..price$..price |
The prices of all items in the store. Result: |
$.store.book[*]$..book[*] |
All books in the store. |
$..book[*].title |
The titles of all books in the store. Result: |
$..book[0] |
The first book. Result: |
$..book[0].title |
The title of the first book. Result: |
$..book[0,1].title$..book[:2].title |
The titles of the first two books. Result: |
$..book[-1:].title$..book[(@.length-1)].title |
The title of the last book. Result: The result is a list, because |
$..book[?(@.author=='J.R.R. Tolkien')].title |
The titles of all books by J.R.R. Tolkien (exact match, case-sensitive). Result: The result is a list, because filters always return lists. |
$..book[?(@.isbn)] |
All books that have the isbn property. |
$..book[?(!@.isbn)] |
All books without the isbn property. |
$..book[?(@.price < 10)] |
All books cheaper than 10. |
$..book[?(@.price > $.expensive)] |
All expensive books. |
$..book[?(@.author =~ /.*Tolkien/i)] |
All books whose author name ends with Tolkien (case-insensitive). |
$..book[?(@.category == 'fiction' || @.category == 'reference')] |
All fiction and reference books. |
$..* |
All members of the JSON structure beneath the root (child objects, individual property values, array items), combined into an array. |
Considerations for JSONPath Expressions That Return Multiple Elements
JSONPath queries can return not just a single element, but also a list of matching elements. For example, given this JSON:
{
"name": "Rose Kolodny",
"phoneNumbers": [
{
"type": "home",
"number": "954-555-1234"
},
{
"type": "work",
"number": "754-555-5678"
}
]
}
the JSONPath expression
phoneNumbers[*].number
returns a list containing two phone numbers:
[954-555-1234, 754-555-5678]
Note that this is not a JSON array, it is just a comma-separated list of items where [ ] indicates the beginning and end of the list.
When using “equals” assertions against a list of matches, specify a list of expected values enclosed in [ ] and separated by a comma and one space:
[apples, 15, false, ["foo","bar"], {"status":"ok"}]
Standalone strings (like apples) should not have enclosing quotes, unless the quotes are part of the value.
Example
Values that are JSON arrays and objects keep inner quotes, but are minified with no spaces between their items: ["foo","bar"], not [ "foo" , "bar" ].
FAQ
How can I check that my JSONPath syntax is valid?
If you have Ready! API 1.9, you can create a test for your API endpoint, add a JSONPath Match assertion and test the syntax in the assertion editor there.
Otherwise, you can use http://jsonpath.herokuapp.com and check the results on the Jayway tab. However, the syntax used on this site may be slightly different from the one used in AlertSite.
See Also
API Assertions
Creating an API Endpoint Monitor
API Endpoint Monitor Settings
JSON JSONPath的更多相关文章
- Snack3 3.2 发布,轻量的Json+Jsonpath框架
Snack3 是一个轻量的 JSON + Jsonpath 框架. 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表 ...
- Python | JSON 数据解析(Json & JsonPath)
一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...
- jsonpath读取json数据格式公用方法!!!
import java.util.LinkedHashMap; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Pred ...
- JsonPath如何获取JSON数据中的值
场景: 发送接口请求后,得到请求结果值是Json数据, 需要从Json数据信息中提取字段值. 响应值字符与字符之间有空格,导致用正则表达式方法提取比较麻烦,于是用java的JsonPath方法提取快速 ...
- python--爬虫之JSON于JsonPath
JSON json的引入 在python中json作为一个内建库不需要额外安装,只需要使用import json执行引入 json模块的功能 在python中json模块提供了四个功能:dumps.d ...
- jmeter ---json几种读取方式,ArrayList循环读取
在之前写过提取json数据格式的文章,这次对jmeter读取json数据格式进行整理. 举例一个接口的response 格式如下: { "data" : { "devic ...
- JMeter获取JSON内容
source("D:\\apache-jmeter-3.0\\用例\\Test.java"); public static void f(){ String response_da ...
- 【JMeter】获取json响应报文中数组长度
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Predicate; import net.minidev.json.J ...
- jmeter beanshell遍历接口返回的json数组
import java.util.LinkedHashMap; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Pred ...
随机推荐
- 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)
传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码
- 2018.10.01 NOIP模拟 卡牌游戏(贪心)
传送门 简单贪心题. 然而考试的时候失了智少讨论了一种情况导致gg. 实际上用到了二分图匹配的思想,L每次找到刚好比当前的牌小一点的出出去,看能匹配几个. 如何处理? 我们先考虑第一种比分策略. 我们 ...
- 2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...
- b2_trsd_EDSD_new
# -*- coding:utf-8 -*- import re ss="./data/" year = '17A' filename = ss+'EDSD%s.txt'%year ...
- struts2-core-2.3.20.jar
核心配置位于该jar struts-default.xml struts-2.3.dtd <?xml version="1.0" encoding="UTF-8&q ...
- 编译hbase-1.2.3源代码
目录 目录 1 1. 约定 1 2. 安装jdk 1 3. 安装maven 1 4. 网络配置 2 4.1. eclipse 3 4.2. maven 3 5. 从hbase官网下载源代码包: 4 6 ...
- (线段树)Mayor's posters --poj -- 2528
链接: http://poj.org/problem?id=2528 覆盖问题, 要从后往前找, 如果已经被覆盖就不能再覆盖了,否则就可以覆盖 递归呀递归什么时候我才能吃透你 代码: #include ...
- hdu 1799 循环多少次?
题目 题意:给出n,m,其中m表示有几层循环,求循环的次数 ①如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算: ②如果代码中出现 fori=1;i<=n ...
- hdu 4981
中位数是否大于平均数 水题 #include <cstdio> #include <cstdlib> #include <cmath> #include <c ...
- 日志记录的作用和方法 java
程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态.好的日志记录方式可以提供我们足够多定位问题的依据.日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事 ...