在JOLT中添加条件语句:仅当存在temp_1时转换温度至摄氏度
解决NiFi中JOLT仅在存在temp_1字段时转换温度的问题
需求说明
在NiFi流中使用JOLT将temp_1字段的华氏温度转换为摄氏度,要求仅当输入JSON包含temp_1字段时才执行转换操作,无该字段时不生成额外的温度相关字段。
现有问题
原JOLT表达式会对所有数组对象执行修改操作,即使输入中没有temp_1字段,也会生成该字段(值为无效的NaN或null),不符合需求。
修正后的JOLT表达式
[ { "operation": "modify-overwrite-beta", "spec": { "*": { "?temp_1": { "temp_1": "=divideAndRound(2,=doubleSum(@(1,temp_1),-32),1.8)" } } } } ]
表达式说明
modify-overwrite-beta:用于覆盖已有字段的值,不会主动创建新字段*:匹配输入数组中的每一个对象?temp_1:JOLT条件匹配器,仅当当前对象包含temp_1字段时,才执行内部的修改逻辑- 嵌套函数直接完成华氏转摄氏计算:
=doubleSum(@(1,temp_1),-32):计算华氏温度减32的中间结果=divideAndRound(2, [上一步结果], 1.8):将中间结果除以1.8,并保留两位小数,得到最终摄氏温度值
测试验证
测试输入1(含temp_1字段)
[ { "rx_state": 0, "tx_id": 3, "temp_1": 54.8, "trans_battery_flag": 0, "ts": 1729646742, "station_name": "abc" } ]
输出结果1
[ { "rx_state": 0, "tx_id": 3, "temp_1": 12.67, "trans_battery_flag": 0, "ts": 1729646742, "station_name": "abc" } ]
测试输入2(无temp_1字段)
[ { "bar_absolute": 30.206, "tz_offset": 3600, "bar_sea_level": 30.483, "bar_offset": -0.001, "bar_trend": 0.016, "ts": 1729646742, "station_name": "abc" } ]
输出结果2
与输入完全一致,未生成额外的temp_1字段。
内容的提问来源于stack exchange,提问作者BHADRAKA HERATH
相关产品推荐
相关产品推荐

