NiFi ExecuteScript(ECMAScript)数组元素查找报错及语法咨询
NiFi 提取JSON数组指定元素属性的解决方案
先划重点:EvaluateJSONPath 其实能搞定这个需求
不用写脚本,直接用EvaluateJSONPath处理器就能实现:
- 配置
Destination为flowfile-attribute或flowfile-content - 填写JSONPath表达式:
$..segments[?(@.REF01 == '0F')].REF02- 若有多个匹配元素,属性模式下返回逗号分隔的字符串,内容模式下返回JSON数组
- 匹配元素无REF02时,对应位置会返回
null
解决ExecuteScript的问题(若你仍需要脚本实现)
常见问题原因
- 箭头函数不能用:NiFi的ExecuteScript默认用Rhino JS引擎,对ES6+箭头函数支持极差,必须用传统语法
- NoSuchMethodException:大多是调用了Rhino不支持的ES6方法(比如
Array.find()),或错误调用了Java类方法
兼容Rhino的JS脚本示例
假设你的JSON片段如下:
{ "segments": [ {"REF01": "0A", "REF02": "val1"}, {"REF01": "0F"}, {"REF01": "0F", "REF02": "val2"} ] }
执行脚本(提取第一个匹配元素的REF02,无则返回空):
// 导入NiFi兼容的Java类 var InputStreamReader = Java.type('java.io.InputStreamReader'); var BufferedReader = Java.type('java.io.BufferedReader'); var StandardCharsets = Java.type('java.nio.charset.StandardCharsets'); var JSONParser = Java.type('org.json.JSONParser'); var flowFile = session.get(); if (flowFile != null) { // 读取流文件内容 var inputStream = session.read(flowFile); var reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); var jsonStr = reader.readLine(); reader.close(); inputStream.close(); // 解析JSON var jsonObj = new JSONParser().parse(jsonStr); var segments = jsonObj.getJSONArray("segments"); var targetRef02 = ""; // 遍历数组查找目标元素 for (var i = 0; i < segments.length(); i++) { var segment = segments.getJSONObject(i); if (segment.has("REF01") && segment.getString("REF01") === "0F") { targetRef02 = segment.has("REF02") ? segment.getString("REF02") : ""; break; // 找到第一个匹配就退出,若要所有匹配则删除此行 } } // 将结果写入流文件属性 flowFile = session.putAttribute(flowFile, "target_ref02", targetRef02); session.transfer(flowFile, REL_SUCCESS); }
扩展说明
- 若要提取所有匹配的REF02,删除循环里的
break,将结果存入数组后拼接成字符串或JSON数组 - 脚本中使用
org.json库是NiFi默认支持的,避免引入额外依赖导致的异常
内容的提问来源于stack exchange,提问作者Abhai Raj Llewellyn
相关产品推荐
相关产品推荐

