使用 `jsonPath` 过滤掉具有空数组的元素的表达式
Expression to filter out elements with empty arrays using `jsonPath`
我有一个 JSON 形式的负载:
[
{"id": 1, "list": [1], "name":"one"},
{"id": 2, "list": [1,2], "name":"two"},
{"id": 3, "list": [], "name":"three"}
]
我想从数组中过滤出包含空 "list"
属性 的元素。换句话说,我想丢弃带有 id=3
的元素,并只处理上面示例中的第一个和第二个元素。
目前,我的过滤器如下所示:
<!-- ne == not equals -->
<int:filter id="filter"
input-channel="in"
output-channel="out"
expression="#jsonPath(payload, '$[*].list') ne '[]'"
discard-channel="consoleOutputChannel" />
但这不起作用,我应该如何向我的 expression
表明我想排除具有空 list
属性的元素?
将你的表情更改为:
$.[?(@.list.length()> 0)]
[?(<expression>)]
: 过滤表达式
@
: 当前正在处理的节点
通过过滤谓词
list.length()
: list
数组的长度
详情请见 JsonPath
在@Jerry06 的帮助下,我能够做我想做的事,但只能在 拆分有效载荷数组之后。
这是完整的解决方案,但我只能在他的帮助下完成 (thx),所以功劳归于他。
我的代码现在看起来像这样:
<!-- Split payload into individual messages -->
<int:splitter id="splitter"
input-channel="in"
output-channel="toFilter"
expression="#jsonPath(payload, '$.[*]')"/>
<!-- Filters out messages with empty array of list -->
<int:filter id="filter"
input-channel="toFilter"
output-channel="out"
discard-channel="consoleOutputChannel"
expression="#jsonPath(payload, '$.list.length()') > 0"/>
我有一个 JSON 形式的负载:
[
{"id": 1, "list": [1], "name":"one"},
{"id": 2, "list": [1,2], "name":"two"},
{"id": 3, "list": [], "name":"three"}
]
我想从数组中过滤出包含空 "list"
属性 的元素。换句话说,我想丢弃带有 id=3
的元素,并只处理上面示例中的第一个和第二个元素。
目前,我的过滤器如下所示:
<!-- ne == not equals -->
<int:filter id="filter"
input-channel="in"
output-channel="out"
expression="#jsonPath(payload, '$[*].list') ne '[]'"
discard-channel="consoleOutputChannel" />
但这不起作用,我应该如何向我的 expression
表明我想排除具有空 list
属性的元素?
将你的表情更改为:
$.[?(@.list.length()> 0)]
[?(<expression>)]
: 过滤表达式@
: 当前正在处理的节点 通过过滤谓词list.length()
:list
数组的长度
详情请见 JsonPath
在@Jerry06 的帮助下,我能够做我想做的事,但只能在 拆分有效载荷数组之后。
这是完整的解决方案,但我只能在他的帮助下完成 (thx),所以功劳归于他。
我的代码现在看起来像这样:
<!-- Split payload into individual messages -->
<int:splitter id="splitter"
input-channel="in"
output-channel="toFilter"
expression="#jsonPath(payload, '$.[*]')"/>
<!-- Filters out messages with empty array of list -->
<int:filter id="filter"
input-channel="toFilter"
output-channel="out"
discard-channel="consoleOutputChannel"
expression="#jsonPath(payload, '$.list.length()') > 0"/>