使用 `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"/>