Выражение для фильтрации элементов с пустыми массивами с использованием `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?


person blurfus    schedule 10.05.2017    source источник
comment
использовать .length()?   -  person Viet    schedule 10.05.2017
comment
Как будет работать синтаксис? кажется, я уже пробовал, и у меня не получилось   -  person blurfus    schedule 10.05.2017


Ответы (2)


Измените свое выражение на:

$.[?(@.list.length()> 0)]
  • [?(<expression>)] : выражение фильтра
  • @ : Текущий узел обрабатывается предикатом фильтра.
  • list.length() : длина массива list

Дополнительные сведения см. на странице JsonPath.

person Viet    schedule 10.05.2017
comment
Я попробую, когда вернусь за свой стол (завтра) и отчитаюсь.. .thx - person blurfus; 10.05.2017
comment
посмотрите Как ответить - person JimHawkins; 10.05.2017
comment
Я не понимаю, почему он не дает ответа? Но nvm, я обновлю более подробную информацию .. - person Viet; 10.05.2017
comment
как вы думаете, это хорошая идея разместить ссылку, которая может стать недействительной? - person JimHawkins; 10.05.2017
comment
что значит неверный? - person Viet; 10.05.2017
comment
другое слово: сломанный - person JimHawkins; 10.05.2017
comment
ссылка на гитхаб не работает? - person Viet; 10.05.2017
comment
Ссылки могут быть битыми, да. Это может случиться (т. е. что, если они получат DDoS? или DNS изменится? или...) есть много причин, по которым сайт может стать недоступным для некоторых пользователей (например, ограничения страны) - всегда лучше включить соответствующий код в ответы и сделать их самодостаточными - person blurfus; 10.05.2017
comment
Кстати, я закончил тем, что разделил полезную нагрузку, прежде чем передать ее фильтру, а затем применил следующее выражение: #jsonPath(payload, '$.docSources.length()') > 0 - это сработало как прелесть только после разделения массива (не раньше) - спасибо - person blurfus; 10.05.2017

С помощью @Jerry06 я смог сделать то, что хотел, но только после разделения массива полезной нагрузки.

Это полное решение, но я смог сделать это только благодаря его помощи (спасибо), так что кредиты ему.

Мой код теперь выглядит так:

<!-- 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"/> 
person blurfus    schedule 10.05.2017