NiFi中EvaluateJson/AttributesToJson输出Null值的实现问题
解决NiFi中AttributesToJSON无法输出Null值的问题
我之前在NiFi里处理JSON属性转内容时也踩过同样的坑,AttributesToJSON确实对null值的处理不太友好,给你几个亲测有效的解决方案:
方案一:用JoltTransformJSON替代AttributesToJSON
Jolt对空值和null的支持比AttributesToJSON灵活得多,完全可以满足你的需求:
- 保持原步骤:通过EvaluateJSONPath把
$.TEST_DATE提取为属性test-date - 添加JoltTransformJSON处理器,设置Jolt规格为:
{ "test-date": "${test-date}" }
当test-date属性为null或者不存在时,Jolt会直接生成JSON原生的null值,而不是字符串"null"或者空字符串,完美符合预期。
方案二:用ExecuteScript手动构建JSON(Groovy示例)
如果需要更自定义的逻辑,用ExecuteScript写个简单的脚本就能精准控制null值输出:
添加ExecuteScript处理器,选择Groovy语言,写入以下脚本:
import groovy.json.JsonBuilder def flowFile = session.get() if (!flowFile) return // 获取test-date属性 def testDateAttr = flowFile.getAttribute('test-date') // 构建JSON对象,属性为空时设置为null def jsonOutput = new JsonBuilder() jsonOutput { 'test-date' testDateAttr ?: null } // 将JSON写入流文件内容 flowFile = session.write(flowFile, { out -> out.write(jsonOutput.toString().getBytes('UTF-8')) } as OutputStreamCallback) session.transfer(flowFile, REL_SUCCESS)
这个脚本会自动判断test-date属性的状态,只要属性是空或者null,就会在JSON中输出原生的null类型。
方案三:优化ReplaceText的正则表达式(降低风险)
如果你暂时不想换处理器,可以优化正则来减少误替换的概率:
- 先用AttributesToJSON生成初始JSON内容
- 添加ReplaceText处理器,设置:
- 搜索正则:
"test-date":\s*(""|"null") - 替换值:
"test-date": null - 匹配模式:
Entire text(根据你的JSON结构选择,单行JSON用这个更精准)
这个正则只会精准匹配test-date字段的空字符串或"null"字符串,替换成原生null,比泛泛的正则安全很多。
- 搜索正则:
内容的提问来源于stack exchange,提问作者Stellar Sword




