请求调整JOLT中的日期格式、类型转换与字符串处理
JOLT转换规则调整解决方案
需求说明
- 将UTC格式日期(如
2024-06-16T23:54:14.711456Z)转换为yyyy-mm-dd hh:mm:ss格式 - 将
code为WEIGHT的value从字符串类型转为decimal类型 - 提取
machinename仅保留名称部分(示例按-分隔拆分,可根据实际格式调整分隔符)
输入JSON
{ "timestamp": "2024-06-16T23:54:14.711456Z", "machinename": "PackagingMachine-001", "metrics": [ { "code": "WEIGHT", "value": "125.5" }, { "code": "TEMP", "value": "22.3" } ] }
现有JOLT规则
[ { "operation": "shift", "spec": { "timestamp": "eventTime", "machinename": "machineName", "metrics": { "*": { "code": "measurements[&1].type", "value": "measurements[&1].value" } } } } ]
期望输出JSON
{ "eventTime": "2024-06-16 23:54:14", "machineName": "PackagingMachine", "measurements": [ { "type": "WEIGHT", "value": 125.5 }, { "type": "TEMP", "value": "22.3" } ] }
调整后的JOLT规则
[ // 预处理:日期拆分、机器名提取、WEIGHT值转类型 { "operation": "modify-overwrite-beta", "spec": { "timestamp": { "splitT": "=split('T', @(1))", "datePart": "@(1,splitT[0])", "splitDot": "=split('\\.', @(1,splitT[1]))", "timePart": "@(1,splitDot[0])", "formattedTime": "=concat(@(1,datePart), ' ', @(1,timePart))" }, "machinename": "=split('-', @(1))[0]", "metrics": { "*": { "isWeight": "=equals(@(1,code), 'WEIGHT')", "value": "=toDouble(@(1))" } } } }, // 结构整理:区分WEIGHT与其他指标的value类型 { "operation": "shift", "spec": { "timestamp": { "formattedTime": "eventTime" }, "machinename": "machineName", "metrics": { "*": { "code": "measurements[&1].type", "value": { "@(2,isWeight)": "measurements[&2].value", "*": { // 非WEIGHT指标转回字符串(若无需保留原类型可删除此层) "=toString(@(1))": "measurements[&3].value" } } } } } }, // 清理临时标记字段 { "operation": "remove", "spec": { "measurements": { "*": { "isWeight": "" } } } } ]
规则说明
- 日期格式转换:通过
split拆分UTC日期的T和.分隔符,提取日期部分与时分秒片段,再用concat拼接成目标格式。 - WEIGHT值类型转换:用
modify-overwrite-beta的toDouble函数转类型,结合equals标记WEIGHT指标,后续通过shift确保仅WEIGHT保留decimal类型,其他指标可按需转回字符串。 - machinename提取:通过
split按指定分隔符(示例为-)拆分字符串,取第一个元素作为名称部分,若实际格式不同,替换分隔符即可(如.改为\\.、_直接写_)。
内容的提问来源于stack exchange,提问作者casper
相关产品推荐
相关产品推荐

