基于JSON属性对单个FlowFile中的JSON数组排序:Apache NiFi
嘿,完全不用折腾自定义处理器!NiFi自带的组件就能轻松搞定这个需求,我给你分享两种靠谱的方案,按需选择:
方案1:用JoltTransformJSON无代码实现(推荐)
Jolt是NiFi内置的JSON转换工具,专门处理这类JSON结构调整的需求,完全不用写代码。
配置步骤:
- 把JoltTransformJSON处理器拖到画布上,连接你的数据源FlowFile。
- 打开处理器配置面板,找到
Jolt Specification属性,填入对应的排序规则:- 按
createdDate升序排序的Jolt规则:[ { "operation": "sort", "spec": { "*": { "createdDate": "asc" } } } ] - 按
createdDate降序排序的话,把上面的"asc"改成"desc"就行。
- 按
- 其他属性保持默认(
Input JSON Path Expression留空表示处理整个FlowFile的JSON内容),保存配置后启动处理器即可。
方案2:用ExecuteScript写轻量Groovy脚本(更灵活)
如果你的JSON结构更复杂,或者需要对日期做更精确的解析(比如非标准格式),用Groovy脚本会更灵活。
配置步骤:
- 添加ExecuteScript处理器到画布,连接数据源。
- 配置处理器:
Script Language选择GroovyScript Body填入下面的脚本,根据需要切换升序/降序:import groovy.json.JsonSlurper import groovy.json.JsonBuilder import java.text.SimpleDateFormat def flowFile = session.get() if (!flowFile) return flowFile = session.write(flowFile, { inputStream, outputStream -> def slurper = new JsonSlurper() def jsonArray = slurper.parse(inputStream) // 👇 选择排序方式:二选一 // 1. 升序排序(针对yyyy-MM-dd HH:mm:ss格式,字符串排序和日期逻辑一致) def sortedArray = jsonArray.sort { it.createdDate } // 2. 降序排序 // def sortedArray = jsonArray.sort { a, b -> b.createdDate <=> a.createdDate } // 如果日期格式不是可字符串排序的类型,转成Date对象再排序(示例) // def sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") // def sortedArray = jsonArray.sort { sdf.parse(it.createdDate) } def builder = new JsonBuilder(sortedArray) outputStream.write(builder.toPrettyString().getBytes('UTF-8')) } as StreamCallback) session.transfer(flowFile, REL_SUCCESS)
- 保存配置后启动处理器即可。
注意事项
- 如果你的JSON数组不是直接在根节点,而是嵌套在某个字段里(比如
{"users": [你的数组]}),需要调整配置:- Jolt方案:把
Input JSON Path Expression设为$.users,Output JSON Path Expression也设为$.users - 脚本方案:把
def jsonArray = slurper.parse(inputStream)改成def jsonArray = slurper.parse(inputStream).users
- Jolt方案:把
- 日期格式如果不是
yyyy-MM-dd HH:mm:ss这种字典序和日期序一致的格式,一定要用脚本里的SimpleDateFormat转成Date对象再排序,避免排序结果错误。
内容的提问来源于stack exchange,提问作者15R6
相关产品推荐
相关产品推荐

