JSONPath平面结构无法过滤字符串

时间:2017-07-19 13:25:43

标签: json jsonpath

将JSONPath与以下

一起使用时
{
    "tradeID": "12345",
    "version": "1"
}

表达式$.tradeID[?(@ == '12345')]没有返回任何内容。

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

为什么呢?看起来过滤器表达式根本不能作为其基础叶子在tradeID上运行吗?

1 个答案:

答案 0 :(得分:1)

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

输入

{
    "tradeID": [ "12345", "67890" ],
    "version": "1"
}

JSONPath

$.tradeID[?(@ == '12345')]

输出

[
  "12345"
]

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

输入

{
    "tradeID": "12345",
    "version": "1",
    "otherID": "12345"
}

JSONPath

$[?(@ == '12345')]

输出

[
  "12345",
  "12345"
]

如果目标只是拉tradeID,则不需要过滤表达式。

输入

{
    "tradeID": "12345",
    "version": "1",
    "otherID": "12345"
}

JSONPath

$.tradeID

输出

[
  "12345"
]

如果目标是在多个文档的数组中按tradeID匹配特定文档,则可以使用与所需tradeID匹配的过滤表达式选择顶级数组的所有元素

输入

[
    {
        "tradeID": "12345",
        "version": "1"
    },
    {
        "tradeID": "67890",
        "version": "2"
    }
]

JSONPath

$.[?(@.tradeID == '12345')]

输出

[
  {
    "tradeID": "12345",
    "version": "1"
  }
]