JSONPath平面结构无法对字符串进行筛选

JSONPath平面结构无法对字符串进行筛选,json,jsonpath,Json,Jsonpath,将JSONPath与以下内容一起使用时 { "tradeID": "12345", "version": "1" } 使用表达式$.tradeID[?(@=='12345')]不会返回任何内容 但是,使用$[?(@=='12345')]表达式可以正确解析 为什么??看起来筛选器表达式根本无法对tradeID进行操作,因为它是一个基叶?表达式$。tradeID[?(@='12345')]表示从根元素导航到子元素tradeID,并匹配筛选的值,以仅选择与'12345匹配的数组元素。

将JSONPath与以下内容一起使用时

{
    "tradeID": "12345",
    "version": "1"
}
使用表达式
$.tradeID[?(@=='12345')]
不会返回任何内容

但是,使用
$[?(@=='12345')]
表达式可以正确解析


为什么??看起来筛选器表达式根本无法对tradeID进行操作,因为它是一个基叶?

表达式
$。tradeID[?(@='12345')]
表示从根元素导航到子元素
tradeID
,并匹配筛选的值,以仅选择与
'12345
匹配的数组元素。由于
tradeID
是一个简单的值,而不是输入中的数组,因此不匹配。如果
tradeID
的值是一个数组,那么它将匹配

输入 JSONPath 输出 正如您所发现的,表达式
$[?(@=='12345')]
确实匹配。此表达式表示从根元素导航到其任何子元素并选择值,将值过滤为仅选择
'12345'
。但是,请注意,如果文档中有其他键映射到值
'12345
,则它返回的值可能会超出您的预期

输入 JSONPath 输出 如果目标只是拉取
tradeID
,则不需要过滤表达式

输入 JSONPath 输出 如果目标是通过多个文档数组中的
tradeID
匹配特定文档,则可以选择顶级数组中的所有元素,并使用与所需
tradeID
匹配的筛选表达式

输入 JSONPath 输出
{
    "tradeID": [ "12345", "67890" ],
    "version": "1"
}
$.tradeID[?(@ == '12345')]
[
  "12345"
]
{
    "tradeID": "12345",
    "version": "1",
    "otherID": "12345"
}
$[?(@ == '12345')]
[
  "12345",
  "12345"
]
{
    "tradeID": "12345",
    "version": "1",
    "otherID": "12345"
}
$.tradeID
[
  "12345"
]
[
    {
        "tradeID": "12345",
        "version": "1"
    },
    {
        "tradeID": "67890",
        "version": "2"
    }
]
$.[?(@.tradeID == '12345')]
[
  {
    "tradeID": "12345",
    "version": "1"
  }
]