表达式使用`jsonPath`过滤掉具有空数组的元素

时间:2017-05-10 04:11:58

标签: java spring spring-integration 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属性的元素?

2 个答案:

答案 0 :(得分:1)

将表达式更改为:

$.[?(@.list.length()> 0)]
  • [?(<expression>)]:过滤表达式
  • @:正在处理的当前节点 通过过滤谓词
  • list.length()list数组
  • 的长度

JsonPath

的详细信息

答案 1 :(得分:0)

在@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"/>