我有JSON对象通过MQTT
从两个不同的输入进入Nifi-例如,假设一个来自顶部传感器,一个来自底部传感器。每个传感器都有自己的MQTT主题,所以我使用两个不同的ConsumeMQTT处理器将这些数据摄取到我的Nifi流中。
JSON顶部传感器的对象是{"Top_Data":"value"}
JSON底部传感器的对象是{"Bottom_Data":"value"}
我目前使用两个独立的EvalateJsonPath处理器来存储Top_Data
或Bottom_Data
的值在一个名为SensorData的属性中。
我如何使用某种if/or语句来只使用一个处理器来评估我可以从MQTT获得的两个JSON对象的JsonPath?基本上,我想有一个表达式,它说"如果我的JSON对象有一个名为Top_Data的属性,使用它的值作为属性传感器数据,否则,使用属性Bottom_Data的值。"
我的EvalateJsonPath处理器示例
也许尝试JSONPath表达式
$[Top_Data,Bottom_Data]
根据https://goessner.net/articles/JsonPath/有可能使用替代运算符[,]
:
[,]
XPath中的联合运算符会导致节点集的组合。JSONPath允许将备用名称或数组索引作为一个集合。
我已经使用http://jsonpath.com/测试了表达式,它应该可以工作。
如果有帮助,请告诉我们。
您可以尝试使用EvalateJsonPath
(属性1:top:$['top']
,属性2:down:$['top']
)来提取它们,当然不要忘记将目标
设置为流文件属性
。
然后,转移到UpdateAt的属性
并设置属性finalData
为${top: ifElse(${top},${top})}
。
如果EvalateJsonPath
找不到完整的元素,那么它会将其设置为空字符串,因此您需要做的就是检查它们中的任何一个是否为空,如果为空,则将最终数据设置为另一个。