NiFi使用AttributesToJSON无法生成数组格式JSON的问题咨询
解决NiFi中AttributesToJSON输出数组为字符串的问题
这是个典型的NiFi属性处理场景问题,核心原因在于NiFi的所有属性值本质都是字符串类型:当你用EvaluateJsonPath把数组提取到myArray属性时,数组会被序列化为带方括号的字符串(比如"[1,2,3,4]"),而AttributesToJSON默认会把所有属性值当作普通字符串处理,自然会给它加上引号,导致最终输出的JSON里数组变成了字符串包裹的形式。
下面给你两种可行的解决方案:
方案一:用JoltTransformJSON将字符串转成数组
这是最简洁的原生处理器方案,步骤如下:
- 在
AttributesToJSON处理器之后添加一个JoltTransformJSON处理器 - 配置Jolt的规范为Modify Overwrite Beta操作,利用
jsonParse函数将字符串解析为JSON数组:{ "operation": "modify-overwrite-beta", "spec": { "myArray": "=jsonParse" } } - 运行流程后,
JoltTransformJSON会把"[1,2,3,4]"字符串解析成真正的JSON数组,最终输出就是你期望的:{"myArray":[1,2,3,4]}
方案二:用ExecuteScript直接生成目标JSON
如果你偏好更灵活的脚本处理,可以用ExecuteScript处理器(推荐用Groovy,性能更优)直接读取属性并生成正确的JSON:
- 添加
ExecuteScript处理器,选择Groovy作为脚本语言 - 替换默认脚本为以下内容:
def flowFile = session.get() if (!flowFile) return // 读取属性并解析为数组 def myArray = new groovy.json.JsonSlurper().parseText(flowFile.getAttribute('myArray')) // 构建目标JSON def outputJson = new groovy.json.JsonBuilder([myArray: myArray]).toString() // 写入FlowFile内容 flowFile = session.write(flowFile, { outputStream -> outputStream.write(outputJson.getBytes('UTF-8')) } as OutputStreamCallback) session.transfer(flowFile, REL_SUCCESS) - 这个脚本会直接把属性里的字符串数组解析为JSON数组,然后生成符合要求的JSON内容,跳过
AttributesToJSON的中间步骤。
额外提示:避免不必要的属性转换
如果你的场景允许,其实可以跳过把数组放到属性的步骤——直接用EvaluateJsonPath处理器设置Destination为flowfile-content,提取myArray对应的JSON结构,再结合其他处理器(比如JoltTransformJSON)来构建最终的JSON对象,这样能避免属性字符串化带来的问题。
内容的提问来源于stack exchange,提问作者raghu
相关产品推荐
相关产品推荐

