NiFi中Groovy脚本解析数据返回空数组问题求助
解决Groovy脚本解析Record记录返回空数组的问题
问题场景
输入是包含Message字段的JSON,Message内容里有多条以换行+Record开头的记录,但现有Groovy脚本返回空数组,无法生成期望的JSON数组。
示例数据
输入JSON
{ "Message": "Some pre-text\nRecord: id=1, name=Alice\nRecord: id=2, name=Bob\nOther irrelevant text\nRecord: id=3, name=Charlie" }
期望输出
[ {"id": "1", "name": "Alice"}, {"id": "2", "name": "Bob"}, {"id": "3", "name": "Charlie"} ]
常见错误脚本及问题分析
以下是容易导致空数组的典型错误脚本:
def inputJson = new JsonSlurper().parseText(input) def message = inputJson.Message def records = message.findAll(/^Record:.*/) def result = records.collect { record -> def props = record.split(/, /).collectEntries { prop -> def (key, value) = prop.split(/=/) [(key): value] } props } return new JsonBuilder(result).toPrettyString()
核心问题
- 正则表达式默认是单行模式,
^只会匹配整个Message字符串的开头,而非每行的开头,导致无法捕获换行后的Record行。 - 未处理值中包含等号的情况,
split(/=/)会把值错误拆分。
修正后的Groovy脚本
@Grab('org.codehaus.groovy:groovy-json:3.0.17') import groovy.json.JsonSlurper import groovy.json.JsonBuilder // 替换为你的输入JSON字符串 def input = ''' { "Message": "Some pre-text\nRecord: id=1, name=Alice\nRecord: id=2, name=Bob\nOther irrelevant text\nRecord: id=3, name=Charlie" } ''' def inputJson = new JsonSlurper().parseText(input) def message = inputJson.Message ?: "" // 处理Message为空的边界情况 // 启用多行模式(?m),匹配每行以Record:开头的内容 def recordMatcher = message =~ /(?m)^Record: (.*)/ def resultList = [] while (recordMatcher.find()) { def recordContent = recordMatcher.group(1).trim() // 解析键值对,split(/=/, 2)确保值含等号时不被拆分 def recordMap = recordContent.split(/, ?/).collectEntries { entry -> def (key, value) = entry.split(/=/, 2) [(key.trim()): value.trim()] } resultList.add(recordMap) } // 输出结果 println new JsonBuilder(resultList).toPrettyString()
关键优化点
- 多行模式正则:添加
(?m)标记,让^匹配每行的起始位置,正确捕获所有Record开头的行。 - 健壮的键值解析:用
split(/=/, 2)限制拆分次数,避免值中包含等号时解析错误;同时用trim()去除多余空格。 - 空值处理:
message ?: ""确保当Message字段为空时脚本不会报错。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

