如何使用ReplaceText或其他处理器将非标准JSON转换为标准JSON
针对非标准JSON转换的NiFi处理器替代方案
除了你正在尝试的ReplaceText,这些处理器也能高效完成需求:
JoltTransformJSON
适合结构化的JSON格式修正与字段修改,建议先通过一次简单替换(比如ReplaceText)把[cpu|usage,mem|usage,disk|usage]转为["cpu|usage","mem|usage","disk|usage"],再用以下Jolt规范替换usage为usages:
[ { "operation": "modify-overwrite-beta", "spec": { "Keyboard": "=replace(@(1), 'usage', 'usages')" } } ]
如果想一步完成,也可以结合字符串拼接的Jolt操作,但先修正数组引号会更稳定。
ExecuteScript
用脚本实现全流程处理,灵活性拉满。比如Groovy脚本示例:
def flowFile = session.get() if (!flowFile) return flowFile = session.write(flowFile, { inputStream, outputStream -> // 移除外层<p>标签 def rawContent = inputStream.text.replaceAll(/<p>(.*)<\/p>/, '$1') // 修正数组元素的引号 def quotedContent = rawContent.replace(/\[([^\]]+)\]/, { match -> def elements = match[1].split(',').collect { "\"${it.trim()}\"" }.join(',') return "[${elements}]" }) // 解析并修改字段值 def jsonObj = new groovy.json.JsonSlurper().parseText(quotedContent) jsonObj.Keyboard = jsonObj.Keyboard.collect { it.replace('usage', 'usages') } // 输出标准JSON outputStream.write(new groovy.json.JsonBuilder(jsonObj).toBytes()) } as StreamCallback) session.transfer(flowFile, REL_SUCCESS)
脚本可以一次性完成标签移除、数组格式修正、字段值替换。
UpdateRecord + 适配型Reader/Writer
如果能先让NiFi识别非标准JSON,就可以用UpdateRecord做字段修改:
- 先用ReplaceText给Keyboard数组的元素加上引号,把非标准数组转为标准格式
- 用JsonTreeReader读取JSON内容
- 在UpdateRecord中,给
Keyboard字段设置表达式:${field.value:replace('usage', 'usages')} - 最后用JsonRecordSetWriter输出标准JSON
补充:ReplaceText的优化用法
如果你继续用ReplaceText,可以分两步处理:
- 第一步处理器:匹配正则
\[([^\]]+)\],替换为["$1"],再添加额外替换规则,把,替换为",",给数组元素补上引号 - 第二步处理器:匹配
usage,替换为usages,完成最终修改
内容的提问来源于stack exchange,提问作者Vyshnavi
相关产品推荐
相关产品推荐

