如何在NiFi中用JOLT处理器过滤含http前缀URL的JSON数组
JOLT过滤数组对象并保留指定字段的正确写法
直接给你能解决问题的JOLT转换规则,适配你的需求:保留数组中存在url字段且url以http开头的完整对象,同时保留id、code等所有原有属性。
示例输入
假设你的输入JSON结构如下:
[ { "id": 1, "code": "A", "url": "http://example.com" }, { "id": 2, "code": "B", "url": "ftp://example.net" }, { "id": 3, "code": "C" }, { "id": 4, "code": "D", "url": "https://test.org" } ]
正确JOLT转换规则
[ { "operation": "shift", "spec": { "*": { "url": { "^http.*": { "@2": "[#2]" } } } } } ]
规则细节解释
*:遍历输入数组中的每一个元素url:先定位到当前元素的url字段,以此作为过滤判断的入口^http.*:用正则匹配url值,确保其以http开头(自动包含https,因为正则匹配的是http起始的任意字符)@2:向上回溯两层,拿到当前元素的完整对象(当前层级是url字段,上一层是数组元素本身,再上一层就是整个元素对象)[#2]:把符合条件的对象按顺序放入新数组,避免生成多余的空元素或重复条目
你之前出现4个元素的原因
大概率是你把id、code等字段单独做了映射,没有嵌套在url的条件判断里。比如错误写法会让每个字段独立生成数组条目,即使url不符合条件,id和code也会被写入数组,导致混入无效对象片段。举个错误写法的例子:
[ { "operation": "shift", "spec": { "*": { "id": "[&1].id", "code": "[&1].code", "url": { "^http.*": "[&2].url" } } } } ]
示例输出
用正确规则处理示例输入后,会得到符合预期的2个对象:
[ { "id": 1, "code": "A", "url": "http://example.com" }, { "id": 4, "code": "D", "url": "https://test.org" } ]
内容的提问来源于stack exchange,提问作者nickdos
相关产品推荐
相关产品推荐

