问题
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 predicatelist.length()
: the length oflist
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