如何在Apache NiFi中提取JSON动态键并验证对应内容
在Apache NiFi中提取JSON动态键并验证数组非空
方案选择
优先推荐JoltTransformJSON + UpdateAttribute的无代码组合,适合快速配置;如果需要更灵活的逻辑,用ExecuteScript写脚本处理。
方案一:无代码配置(Jolt + UpdateAttribute)
1. 用Jolt转换JSON结构
通过Jolt规范把options下的动态键值对转成可处理的数组,同时过滤非空数组:
[ { "operation": "shift", "spec": { "values": { "Reasons": { "options": { "*": { "$": "option_ids[]", "@": "option_arrays[]" } } } } } }, { "operation": "modify-overwrite-beta", "spec": { "non_empty_ids": "=filter(option_ids, option_arrays[&] != [])" } } ]
转换后会生成三个字段:
option_ids:所有动态ID的数组(如["9876","9875","9874"])option_arrays:对应ID的数组列表non_empty_ids:仅保留对应数组非空的ID
2. 用UpdateAttribute存入变量
在UpdateAttribute处理器中,用表达式把结果转为属性变量:
- 提取所有ID:
all_option_ids=${option_ids:join(',')} - 提取非空ID:
non_empty_option_ids=${non_empty_ids:join(',')}
方案二:Groovy脚本处理(ExecuteScript)
如果需要自定义逻辑,用Groovy脚本直接解析JSON并提取结果:
import groovy.json.JsonSlurper def flowFile = session.get() if (!flowFile) return def json = new JsonSlurper().parseText(flowFile.read().getText('UTF-8')) def optionsMap = json.values.Reasons.options // 提取所有动态ID def allIds = optionsMap.keySet().toList() // 过滤出对应数组非空的ID def nonEmptyIds = allIds.findAll { id -> optionsMap[id]?.size() > 0 } // 存入NiFi属性 flowFile = session.putAttribute(flowFile, 'all_option_ids', allIds.join(',')) flowFile = session.putAttribute(flowFile, 'non_empty_option_ids', nonEmptyIds.join(',')) session.transfer(flowFile, REL_SUCCESS)
脚本执行后,all_option_ids和non_empty_option_ids会作为属性附加在FlowFile上,后续处理器可直接调用。
验证逻辑说明
- 空数组判断:NiFi表达式用
isEmpty()方法,脚本中用size() > 0校验 - 动态键匹配:Jolt用
*通配符匹配所有不确定键名,脚本用keySet()直接获取所有键
内容的提问来源于stack exchange,提问作者Destiel
相关产品推荐
相关产品推荐

