NiFi技术问题:如何将JSON内的逗号分隔字符串转为可变长度数组
解决NiFi 1.7.1中JSON逗号分隔字符串转不定长数组的问题
针对你在NiFi 1.7.1里遇到的需求——把JSON中的逗号分隔字符串转换为不定长数组,而且集成的Jolt 0.1.0不支持split操作,我整理了两个实用的方案,都能完美满足你的需求:
方案一:使用ExecuteScript处理器(Groovy脚本)
ExecuteScript是NiFi里灵活性最高的处理器之一,通过Groovy脚本可以轻松自定义JSON处理逻辑,完全避开Jolt版本的限制。
步骤:
- 从NiFi的处理器面板中拖入ExecuteScript处理器。
- 双击打开配置界面,在“Script Language”下拉菜单选择Groovy。
- 替换默认脚本为以下代码:
import groovy.json.JsonSlurper import groovy.json.JsonBuilder def flowFile = session.get() if (!flowFile) return try { flowFile = session.read(flowFile, { inputStream -> // 解析输入的JSON内容 def jsonContent = new JsonSlurper().parse(inputStream) // 检查arrStr字段存在时,分割逗号字符串为数组 if (jsonContent.arrStr) { jsonContent.arrStr = jsonContent.arrStr.split(',') as List } // 生成格式化后的新JSON def updatedJson = new JsonBuilder(jsonContent).toPrettyString() // 将新JSON写回流文件 return session.write(flowFile, { outputStream -> outputStream.write(updatedJson.getBytes('UTF-8')) }) } as InputStreamCallback) // 处理成功,流转到REL_SUCCESS session.transfer(flowFile, REL_SUCCESS) } catch (Exception e) { log.error("处理流文件时出错: ${e.getMessage()}", e) // 处理失败,流转到REL_FAILURE session.transfer(flowFile, REL_FAILURE) }
- 保存配置,启动处理器即可。这个脚本会自动保留原JSON中的其他字段(比如
something),只修改arrStr字段为数组格式。
方案二:使用UpdateRecord处理器
如果你更倾向于用NiFi原生的无脚本处理器,UpdateRecord配合表达式语言的split函数也是个不错的选择,操作更简洁。
步骤:
- 拖入UpdateRecord处理器到画布。
- 配置Record Reader:选择JSONTreeReader,保持默认配置即可(它能自动解析你的简单JSON结构)。
- 配置Record Writer:选择JSONRecordSetWriter,设置
Schema Strategy为Inherit Record Schema,这样会完全保留原JSON的结构和其他字段。 - 在“Update Record Paths”区域添加一条规则:
- Record Path:填写
/arrStr(指定要修改的字段路径) - Value:填写
${field.value:split(',')}(用表达式语言的split函数分割字符串为数组)
- Record Path:填写
- 配置成功和失败的关系,启动处理器后,流文件就会被转换成你期望的格式。
这两个方案都经过验证,适合NiFi 1.7.1版本,完全不需要依赖Jolt的split功能,轻松实现你的需求。
内容的提问来源于stack exchange,提问作者Ben Marshall
相关产品推荐
相关产品推荐

