#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».
Ответ №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
не будет найден полный элемент, то он установит его как пустую строку, поэтому все, что вам нужно сделать, это проверить, является ли какой-либо из них пустым, и если это так, задайте конечные данные в качестве другого.