Expression to filter out elements with empty arrays using `jsonPath`

核能气质少年 提交于 2019-12-11 14:40:32

问题


I have a JSON payload of the form:

[
  {"id": 1, "list": [1], "name":"one"}, 
  {"id": 2, "list": [1,2], "name":"two"},
  {"id": 3, "list": [], "name":"three"}
]

And I want to filter out the element from the array the contains an empty "list" property. In other words, I want to discard the element with id=3 and process only the first and second element in my example above.

Currently, my filter looks like this:

<!-- ne == not equals -->
<int:filter id="filter" 
            input-channel="in" 
            output-channel="out" 
            expression="#jsonPath(payload, '$[*].list') ne '[]'"
            discard-channel="consoleOutputChannel" />

But this is not working, how should I indicate to my expression that I want to exclude elements with empty list properties?


回答1:


Change your expression to:

$.[?(@.list.length()> 0)]
  • [?(<expression>)] : filter expression
  • @ : The current node being processed by a filter predicate
  • list.length() : the length of list array

More detail at JsonPath




回答2:


With the help of @Jerry06, I was able to do what I wanted but only after splitting the payload array.

This is the complete solution but I could only do it because of his help (thx) so the credits are to him.

My code now looks like this:

<!-- 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"/> 


来源:https://stackoverflow.com/questions/43883443/expression-to-filter-out-elements-with-empty-arrays-using-jsonpath

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!