如何在NiFi中将JSON数组转换为换行分隔JSON格式
问题场景
需要将单批次包含超2000个字段的JSON数组格式文件,转换为换行分隔的JSON块格式,已知SplitJSON拆分+MergeContent合并的实现方案,寻求无需拆分、合并原文件的替代方案。
输入示例
输入为标准JSON数组结构:
[ { "Test1": 1, "Test2": 2, "Test3": 3 }, { "Test4": 4, "Test5": 5 }, { "Test6": 6, "Test7": 7, "Test8": 8 }, { "Test9": 9, "Test10": 10 } ]
预期输出
移除数组外层方括号,删除JSON对象之间的分隔逗号,每个JSON对象独立成块按行分隔:
{ "Test1": 1, "Test2": 2, "Test3": 3 } { "Test4": 4, "Test5": 5 } { "Test6": 6, "Test7": 7, "Test8": 8 } { "Test9": 9, "Test10": 10 }
现有进展
已通过ReplaceText处理器实现外层方括号[ ]的移除,但无法正确处理大括号之间的分隔逗号,无法生成合规输出。
可直接落地的无拆分实现方案
所有方案均在单流文件内完成处理,无拆分、合并开销,适配大文件处理场景:
- 方案1:ReplaceText正则替换(性能最优,零额外依赖)
直接在现有ReplaceText处理器上配置两条顺序执行的正则替换规则即可,不需要新增其他处理器:- 移除首尾方括号:搜索值填
^\s*\[|\]\s*$,替换值留空,匹配模式选择「正则表达式」,替换策略选「预置替换」 - 处理对象间分隔逗号:搜索值填
\}(\s*),(\s*)\{,替换值填}\n\n{,匹配模式选择「正则表达式」
该正则只会匹配两个JSON对象闭合
}和起始{之间的逗号,JSON对象内部字段后的逗号后永远跟的是字段键的双引号,不会匹配到{,因此完全不会误删对象内部的逗号,适配格式化JSON数组的处理场景,性能远高于拆分合并方案。
如果源JSON是压缩无换行格式(如[{"a":1},{"b":2}]),将第二步替换值调整为}\n{即可。 - 移除首尾方括号:搜索值填
- 方案2:JoltTransformJSON转换
不想用正则的话可以用Jolt处理器完成结构转换,配置如下Jolt规范即可将数组打平为平级对象集合:
转换后再用简单的字符替换移除首尾残留的数组包裹符号即可,全程单流文件处理。[ { "operation": "shift", "spec": { "*": "&" } } ] - 方案3:ExecuteScript自定义脚本处理
需要更灵活的容错能力时,可以用Groovy脚本在处理器内做流式扫描:逐字符读取JSON内容,维护大括号嵌套层级计数器,当层级从1归0时,跳过后续出现的逗号和空白字符,写入两个换行符后继续读取后续内容即可,内存占用极低,支持GB级超大JSON文件处理。
内容的提问来源于stack exchange,提问作者Maykid
相关产品推荐
相关产品推荐

