本节概述了在 监控项 值预处理步骤中支持的 JSONPath 功能。
JSONPath 由点分隔的段组成。
一段可以是简单单词,表示一个 JSON 值名称,通配符字符(*
),或者用方括号括起来的更复杂结构。
在方括号段前面的点是可选的,可以省略。
JSONPath 示例 | 描述 |
---|---|
$.object.name |
返回 object.name 内容。 |
$.object['name'] |
返回 object.name 内容。 |
$.object.['name'] |
返回 object.name 内容。 |
$["object"]['name'] |
返回 object.name 内容。 |
$.['object'].["name"] |
返回 object.name 内容。 |
$.object.history.length() |
返回 object.history array 元素的数量。 |
$[?(@.name == 'Object')].price.first() |
从名为 "object" 的第一个 object 中返回 price 属性的值。 |
$[?(@.name == 'Object')].history.first().length() |
从名为 "object" 的第一个 object 中返回历史 array 元素的数量。 |
$[?(@.price > 10)].length() |
返回价格大于 10 的 objects 数量。 |
另请参阅:Escaping special characters from LLD macro values in JSONPath。
Segment | 描述 |
---|---|
<name> |
按名称匹配 object 属性。 |
* |
匹配所有 object 属性。 |
['<name>'] |
按名称匹配 object 属性。 |
['<name>', '<name>', ...] |
按照列出的任意名称匹配 object 属性。 |
[<index>] |
按索引匹配 array 元素。 |
[<number>, <number>, ...] |
按照列出的任意索引匹配 array 元素。 |
[*] |
匹配所有 object 属性或 array 元素。 |
[<start>:<end>] |
按定义的范围匹配 array 元素: <start> - 要匹配的第一个索引(包含);如果未指定,则从开头匹配所有 array 元素;如果为负数,则从 array 末尾开始指定偏移量; <end> - 要匹配的最后一个索引(不包含);如果未指定,则匹配所有到末尾的 array 元素;如果为负数,则从 array 末尾开始指定偏移量。 |
[?(<expression>)] |
通过应用过滤表达式匹配 objects/array 元素。 |
要查找忽略其祖先关系的匹配段(分离段),必须在其前加上两个点(..
)。 例如,$..name
或 $..['name']
返回所有 name
属性的值。
通过在 JSONPath 后添加波浪号(~
)后缀,可以提取匹配的元素名称。 它返回匹配的 object 的名称,或匹配的 array 监控项 的索引(以 string 格式)。 输出格式遵循与其他 JSONPath queries 相同的规则 - 确定性路径结果按原样返回,而不确定性路径结果则以 array 形式返回。 然而,提取符合确定性路径的元素名称几乎没有实际价值,因为该名称已经是已知的。
过滤表达式是使用中缀表示法的算术表达式。
支持的操作数:
操作数 | 描述 |
---|---|
"<text>" '<text>' |
文本常量。 示例: 'value: \\'1\\'' "value: '1'" |
<number> |
支持科学计数法的数值常量。 示例: 123 |
<jsonpath starting with $> |
从输入文档根节点引用的JSONPath值;仅支持确定路径。 示例: $.object.name |
<jsonpath starting with @> |
从当前 object/元素引用的JSONPath值;仅支持确定路径。 示例: @.name |
支持的操作符:
操作符 | 类型 | 描述 | 结果 |
---|---|---|---|
- |
Binary | 减法 | 数字 |
+ |
Binary | 加法 | 数字 |
/ |
Binary | 除法 | 数字 |
* |
Binary | 乘法 | 数字 |
== |
Binary | 等于 | boolean (1/0) |
!= |
Binary | 不等于 | boolean (1/0) |
< |
Binary | 小于 | boolean (1/0) |
<= |
Binary | 小于等于 | boolean (1/0) |
> |
Binary | 大于 | boolean (1/0) |
>= |
Binary | 大于等于 | boolean (1/0) |
=~ |
Binary | 匹配正则表达式 | boolean (1/0) |
! |
Unary | boolean 非 | boolean (1/0) |
|| |
Binary | boolean 或 | boolean (1/0) |
&& |
Binary | boolean 与 | boolean (1/0) |
函数可以用于JSONPath的末尾。 如果前一个函数返回的值被后一个函数所接受,则可以将多个函数链接在一起。
支持的函数:
函数 | 描述 | 输入 | 输出 |
---|---|---|---|
avg |
输入array中数字的平均值 | 数字的array | 数字 |
min |
输入array中数字的最小值 | 数字的array | 数字 |
max |
输入array中数字的最大值 | 数字的array | 数字 |
sum |
输入array中数字的总和 | 数字的array | 数字 |
length |
输入array中的元素数量 | array | 数字 |
first |
array的第一个元素 | array | JSON结构(object、array、值),具体取决于输入array的内容 |
JSONPath聚合函数接受带引号的数值。 在需要聚合时,这些值会自动从字符串转换为数值类型。 不兼容的输入将导致函数generate返回错误。
JSONPaths 可以分为确定路径和不确定路径。 明确的路径只能返回空值或单个匹配项。 不定路径可能会返回多个匹配项:带有分离的多个名称/索引列表、array 片段或表达式段的 JSON 路径。 然而,当使用函数时,JSONPath 变得明确,因为函数始终输出单个值。
一个确定的路径返回它所引用的object/array/value。 相反,无限路径会返回匹配的 array 的 objects/数组/值的集合。
::: noteimportant 由于内部优化方法,JSONPath query 结果中的属性顺序可能与原始 JSON 属性顺序不一致。 例如,JSONPath $.books[1]["author", "title"]
可能返回 ["title", "author"]
。 如果保持原始属性顺序至关重要,则应考虑替代的后期query处理方法。 仅返回OutputFormat格式要求结果
空格和制表符可用于方括号表示法的段和表达式中,例如:$[ 'a' ][ 0 ][ ?( $.b == 'c' ) ][ : -1 ].first( )
。
字符串应使用单引号('
)或双引号("
)括起来。 在字符串内部,单引号或双引号(取决于用于括起字符串的引号类型)以及反斜杠(\
)通过反斜杠(\
)进行转义。
{
"books": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95,
"id": 1
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99,
"id": 2
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99,
"id": 3
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99,
"id": 4
}
],
"services": {
"delivery": {
"servicegroup": 1000,
"description": "Next day delivery in local town",
"active": true,
"price": 5
},
"bookbinding": {
"servicegroup": 1001,
"description": "Printing and assembling book in A5 format",
"active": true,
"price": 154.99
},
"restoration": {
"servicegroup": 1002,
"description": "Various restoration methods",
"active": false,
"methods": [
{
"description": "Chemical cleaning",
"price": 46
},
{
"description": "Pressing pages damaged by moisture",
"price": 24.5
},
{
"description": "Rebinding torn book",
"price": 99.49
}
]
}
},
"filters": {
"price": 10,
"category": "fiction",
"no filters": "no \"filters\""
},
"closed message": "Store is closed",
"tags": [
"a",
"b",
"c",
"d",
"e"
]
}
JSONPath | 类型 | 结果 |
---|---|---|
$.filters.price |
definite | 10 |
$.filters.category |
definite | 小说 |
$.filters['no filters'] |
definite | 无 "filters" |
$.filters |
definite | { "price": 10, "category": "fiction", "no filters": "no \"filters\"" } |
$.books[1].title |
definite | 荣誉之剑 |
$.books[-1].author |
definite | J. R. R. 托尔金 |
$.books.length() |
definite | 4 |
$.tags[:] |
indefinite | ["a", "b", "c", "d", "e" ] |
$.tags[2:] |
indefinite | ["c", "d", "e" ] |
$.tags[:3] |
indefinite | ["a", "b", "c"] |
$.tags[1:4] |
indefinite | ["b", "c", "d"] |
$.tags[-2:] |
indefinite | ["d", "e"] |
$.tags[:-3] |
indefinite | ["a", "b"] |
$.tags[:-3].length() |
definite | 2 |
$.books[0, 2].title |
indefinite | ["白鲸记", "世纪名言"] |
$.books[1]['author', "title"] |
indefinite | ["荣誉之剑", "伊夫林·沃"] |
$..id |
indefinite | [1, 2, 3, 4] |
$.services..price |
indefinite | [154.99, 5, 46, 24.5, 99.49] |
$.books[?(@.id == 4 - 0.4 * 5)].title |
indefinite | ["荣誉之剑"] 注意:此 query 表明可以在 queries 中使用算术运算;它可以简化为 $.books[?(@.id == 2)].title |
$.books[?(@.id == 2 \|\| @.id == 4)].title |
indefinite | ["荣誉之剑", "指环王"] |
$.books[?(!(@.id == 2))].title |
indefinite | ["世纪名言", "白鲸记", "指环王"] |
$.books[?(@.id != 2)].title |
indefinite | ["世纪名言", "白鲸记", "指环王"] |
$.books[?(@.title =~ " of ")].title |
indefinite | ["世纪名言", "荣誉之剑", "指环王"] |
$.books[?(@.price > 12.99)].title |
indefinite | ["指环王"] |
$.books[?(@.author > "Herman Melville")].title |
indefinite | ["世纪名言", "指环王"] |
$.books[?(@.price > $.filters.price)].title |
indefinite | ["荣誉之剑", "指环王"] |
$.books[?(@.category == $.filters.category)].title |
indefinite | ["荣誉之剑", "白鲸记", "指环王"] |
$.books[?(@.category == "fiction" && @.price < 10)].title |
indefinite | ["白鲸记"] |
$..[?(@.id)] |
indefinite | [ { "price": 8.95, "id": 1, "category": "reference", "author": "Nigel Rees", "title": "世纪名言" }, { "price": 12.99, "id": 2, "category": "fiction", "author": "Evelyn Waugh", "title": "荣誉之剑" }, { "price": 8.99, "id": 3, "category": "fiction", "author": "Herman Melville", "title": "白鲸记", "isbn": "0-553-21311-3" }, { "price": 22.99, "id": 4, "category": "fiction", "author": "J. R. R. Tolkien", "title": "指环王", "isbn": "0-395-19395-8" } ] |
$.services..[?(@.price > 50)].description |
indefinite | ["A5格式印刷和装订书籍", "重新装订破损书籍"] |
$..id.length() |
definite | 4 |
$.books[?(@.id == 2)].title.first() |
definite | 荣誉之剑 |
$..tags.first().length() |
definite | 5 注意: $..tags 是一个不定路径,因此它返回匹配元素的 array,即 [["a", "b", "c", "d", "e" ]] ;first() 返回第一个元素,即 ["a", "b", "c", "d", "e"] ;length() 计算元素的长度,即 5 。 |
$.books[*].price.min() |
definite | 8.95 |
$..price.max() |
definite | 154.99 |
$.books[?(@.category == "fiction")].price.avg() |
definite | 14.99 |
$.books[?(@.category == $.filters.xyz)].title |
indefinite | 注意:没有匹配项的 query 对于确定和不确定路径返回 NULL。 |
$.services[?(@.active=="true")].servicegroup |
indefinite | [1001,1000] 注意:文本常量必须用于 boolean 值比较。 |
$.services[?(@.active=="false")].servicegroup |
indefinite | [1002] 注意:文本常量必须用于 boolean 值比较。 |
$.services[?(@.servicegroup=="1002")]~.first() |
definite | 修复 |