Apache Nifi вычисляет JSONPath с несколькими входами

#apache-nifi #json-path-expression

#apache-nifi #json-path-expression

Вопрос:

У меня есть объекты JSON, поступающие в Nifi через MQTT с двух разных входов — например, скажем, один от верхнего датчика, а другой от нижнего датчика. У каждого из датчиков есть своя тема MQTT, поэтому я использую два разных процессора ConsumeMQTT для ввода этих данных в мой поток Nifi.

Объект JSON для верхнего датчика является {"Top_Data": "value"}

Объект JSON для нижнего датчика является {"Bottom_Data": "value"}

В настоящее время я использую два отдельных процессора EvaluateJsonPath для хранения значения Top_Data или Bottom_Data в атрибуте, называемом sensorData.

Как я могу использовать какой-либо оператор if / or, чтобы использовать только один процессор для вычисления JSONPath для обоих объектов JSON, которые я мог бы получить из MQTT? В принципе, я хочу иметь выражение, которое гласит: «Если мой объект JSON имеет свойство с именем Top_Data, используйте его значение для атрибута sensorData, в противном случае используйте значение из свойства Bottom_Data».

Пример моего процессора EvaluateJsonPath

Ответ №1:

возможно, попробуйте выражение JSONPath

 $[Top_Data,Bottom_Data]
  

в единственном EvaluateJSONPathProcessor .
Согласно https://goessner.net/articles/JsonPath / существует возможность использовать альтернативный оператор [,] :

[,] Оператор объединения в XPath приводит к комбинации наборов узлов. JSONPath допускает альтернативные имена или индексы массива в виде набора.

Я протестировал выражение с помощью http://jsonpath.com / и это должно сработать.

Дайте нам знать, если это поможет.

Комментарии:

1. Это не сработает. Если он не может найти какой-либо из элементов в операторе объединения, он передает потоковый файл в umatched relationship без извлечения требуемых данных.

Ответ №2:

Вы могли бы попробовать извлечь их оба, используя EvaluateJsonPath (свойство 1: top: $['top'] , свойство 2: bottom: $['bottom'] ) и, конечно, не забудьте установить Destination значение flowfile-attribute .

Затем передайте в UpdateAttribute и установите свойство finalData как ${top:isEmpty():ifElse(${bottom}, ${top})} .

Если EvaluateJsonPath не будет найден полный элемент, то он установит его как пустую строку, поэтому все, что вам нужно сделать, это проверить, является ли какой-либо из них пустым, и если это так, задайте конечные данные в качестве другого.