如何不拆分完整JSON FlowFile直接执行JoltTransformation转换
问题说明
InvokeHTTP组件返回的待处理FlowFile内容为JSON数组,格式如下:
[ { "name": "Rolf", "sur_name": "ramsfl" }, { "name": "Jose", "sur_name": "maxim" }, { "name": "Andrei", "sur_name": "alexo" } ]
需要用JoltTransformation组件替代ReplaceText组件完成字段映射——原ReplaceText组件通过全局查找替换"_"为空字符串修改字段名,无法满足精准修改指定字段名的需求。
最初编写的基于shift操作的Jolt转换规则如下:
[ { "operation": "shift", "spec": { "name":"name", "sur_name":"surname" } } ]
该规则存在适配问题:FlowFile被拆分为单条JSON对象处理时,可以正常将sur_name字段映射为surname;但直接传入未拆分的完整数组格式FlowFile时,转换结果返回null。需要实现不拆分FlowFile,直接对整份JSON流文件完成字段转换的效果。
故障原因
原有规则仅适配根节点为单个JSON对象的输入场景,当输入根节点为JSON数组时,规则没有配置数组层级的遍历匹配逻辑,Jolt无法定位到数组内部的字段,因此返回空结果。
解决方法
调整shift规则,增加数组通配匹配逻辑,遍历数组内每个对象执行字段映射即可,不需要拆分FlowFile。修正后的完整Jolt规则如下:
[ { "operation": "shift", "spec": { "*": { "name": "[&1].name", "sur_name": "[&1].surname" } } } ]
规则逻辑说明:
- 最外层的
"*"为通配符,匹配根数组下的每一个元素 [&1]表示将当前处理的字段值,写入目标数组中与当前遍历元素索引一致的位置,保证输出数组的元素顺序和输入完全一致- 内部字段映射逻辑和拆分场景下的逻辑完全一致:保留
name字段原名,将sur_name重命名为surname
以上述示例输入执行转换后,输出结果如下,符合预期:
[ { "name": "Rolf", "surname": "ramsfl" }, { "name": "Jose", "surname": "maxim" }, { "name": "Andrei", "surname": "alexo" } ]
内容的提问来源于stack exchange,提问作者user19031918
相关产品推荐
相关产品推荐

