将JSONPath与以下
一起使用时{
"tradeID": "12345",
"version": "1"
}
表达式$.tradeID[?(@ == '12345')]
没有返回任何内容。
然而,使用$[?(@ == '12345')]
表达式可以正确解析。
为什么呢?看起来过滤器表达式根本不能作为其基础叶子在tradeID上运行吗?
答案 0 :(得分:1)
表达式$.tradeID[?(@ == '12345')]
表示从根元素导航到子元素tradeID
并匹配过滤后的值以仅选择与'12345
'匹配的数组元素。由于tradeID
是一个简单的值而不是输入中的数组,因此不匹配。如果tradeID
的值是一个数组,那么它将匹配。
{
"tradeID": [ "12345", "67890" ],
"version": "1"
}
$.tradeID[?(@ == '12345')]
[
"12345"
]
正如您所发现的,表达式$[?(@ == '12345')]
确实匹配。此表达式表示从根目录导航到其任何子元素并选择值,并将值过滤以仅选择'12345'
。但是,请注意,如果文档中有其他键映射到值'12345
',那么它可能会返回超出预期的值。
{
"tradeID": "12345",
"version": "1",
"otherID": "12345"
}
$[?(@ == '12345')]
[
"12345",
"12345"
]
如果目标只是拉tradeID
,则不需要过滤表达式。
{
"tradeID": "12345",
"version": "1",
"otherID": "12345"
}
$.tradeID
[
"12345"
]
如果目标是在多个文档的数组中按tradeID
匹配特定文档,则可以使用与所需tradeID
匹配的过滤表达式选择顶级数组的所有元素
[
{
"tradeID": "12345",
"version": "1"
},
{
"tradeID": "67890",
"version": "2"
}
]
$.[?(@.tradeID == '12345')]
[
{
"tradeID": "12345",
"version": "1"
}
]