如何使用JOLT或NiFi工具拆分JSON的id字段提取UTM参数?
用JOLT或NiFi实现UTM参数解析需求
需求说明
输入JSON
[ { "id": "28573041|utm_source=vodafone&utm_medium=banner&utm_campaign=smartphones", "date": "2022-05-03" }, { "id": "28573041|utm_campaign=Vodafone_uppers_2022", "date": "2022-05-03" } ]
解析规则
|之前的内容为真实ID,替换原id字段值=之前为参数属性名,之后为属性值,需将这些键值对作为新字段添加到对象中- 支持的参数仅为:
utm_source、utm_medium、utm_campaign、utm_term、utm_content,顺序不固定
目标输出JSON
[ { "id" : "28573041", "date" : "2022-05-03", "utm_source" : "vodafone", "utm_medium" : "banner", "utm_campaign" : "smartphones" }, { "id" : "28573041", "date" : "2022-05-03", "utm_campaign" : "Vodafone_uppers_2022" } ]
JOLT转换方案
可以通过JOLT规范实现上述解析,以下是对应的JOLT转换规则:
[ { "operation": "modify-overwrite-beta", "spec": { "*": { "id_parts": "=split('|', @(1,id))", "real_id": "@(1,id_parts[0])", "params_str": "@(1,id_parts[1])", "params_list": "=split('&', @(1,params_str))" } } }, { "operation": "shift", "spec": { "*": { "real_id": "[&1].id", "date": "[&1].date", "params_list": { "*": { "@": "[&3].temp" } } } } }, { "operation": "modify-overwrite-beta", "spec": { "*": { "temp": { "*": "=split('=', @)" } } } }, { "operation": "shift", "spec": { "*": { "id": "[&1].id", "date": "[&1].date", "temp": { "*": { "0": "[&3].key", "1": "[&3].value" } } } } }, { "operation": "shift", "spec": { "*": { "id": "[&1].id", "date": "[&1].date", "key": { "*": { "@(2,value[&1])": "[&4].@" } } } } }, { "operation": "remove", "spec": { "*": { "key": "", "value": "" } } } ]
规则说明
- 拆分ID字段:将原
id按|拆分为真实ID和参数字符串,再将参数字符串按&拆分为单个参数列表 - 提取键值对:将每个参数按
=拆分为键和值的数组 - 映射字段:将键值对映射为对象的新字段,保留原
date字段 - 清理临时字段:移除转换过程中生成的临时辅助字段
NiFi实现步骤
在NiFi中可以通过JoltTransformJSON处理器快速实现该需求:
- 添加
JoltTransformJSON处理器到流程中 - 配置处理器的Jolt Specification为上述JOLT规则
- 将原始JSON数据作为输入连接到该处理器
- 处理器输出即为解析后的目标JSON格式
如果不使用JOLT,也可以通过SplitText、ReplaceText、EvaluateJsonPath等处理器组合实现,但JOLT方案更简洁高效,适合结构化的JSON转换场景。
内容的提问来源于stack exchange,提问作者takotsubo
相关产品推荐
相关产品推荐

