如何用Jolt处理JSON对象/数组并提取首个非空systemName值
使用Jolt处理单对象/数组输入,提取首个非空非null值
我拿到的JSON输入里,insertEvent字段有时是单个对象,有时是数组形式。需要从insertEvent.systemDetails.systems.sourceSystemName和insertEvent.xrefKey.systemName这两个字段里,提取第一个非空、非null的值作为systemName输出,该怎么用Jolt实现?
无数组的输入示例
{ "eventMetadata": { "eventType": "Insert", "baseObjectUid": "BASE_OBJECT", "orsId": "orcl-TCR_HUB", "triggerUid": "MESSAGE_QUEUE_RULE", "messageId": "300894188", "messageDate": "2023-08-30T23:54:32.335Z" }, "insertEvent": { "systemDetails":{ "systems":{ "sourceSystemName": "R12" } }, "sourceKey": "XXXXX", "eventDate": "2023-08-30T23:54:32.335Z", "rowid": "9800029", "xrefKey": { "systemName": "", "sourceKey": "XXXXX" } } }
预期输出
{ "systemName": "R12" }
带数组的输入示例
{ "eventMetadata": { "eventType": "Insert", "baseObjectUid": "BASE_OBJECT", "orsId": "orcl-TCR_HUB", "triggerUid": "MESSAGE_QUEUE_RULE", "messageId": "300894188", "messageDate": "2023-08-30T23:54:32.335Z" }, "insertEvent": [ { "systemDetails":{ "systems":{ "sourceSystemName": "" } }, "sourceKey": "XXXXX", "eventDate": "2023-08-30T23:54:32.335Z", "rowid": "9800029", "xrefKey": { "systemName": "", "sourceKey": "XXXXX" } }, { "systemDetails":{ "systems":{ "sourceSystemName": "R12" } }, "sourceKey": "XXXXX", "eventDate": "2023-08-30T23:54:32.335Z", "rowid": "9800029", "xrefKey": { "systemName": "", "sourceKey": "XXXXX" } }, { "systemDetails":{ "systems":{ "sourceSystemName": "Y12" } }, "sourceKey": "XXXXX", "eventDate": "2023-08-30T23:54:32.335Z", "rowid": "9800029", "xrefKey": { "systemName": "Y12", "sourceKey": "XXXXX" } } ] }
预期输出
{ "systemName": "R12" }
Jolt转换规则
核心思路是先统一输入格式(把单个对象转成数组),再收集所有候选值、过滤空值,最后取第一个有效结果。
[ // 第一步:统一格式,把单个insertEvent对象转为数组,数组则保持原样 { "operation": "shift", "spec": { "insertEvent": { "*": "insertEvent[]", "@": "insertEvent[]" } } }, // 第二步:收集所有候选的systemName值 { "operation": "shift", "spec": { "insertEvent": { "*": { "systemDetails": { "systems": { "sourceSystemName": "candidates[]" } }, "xrefKey": { "systemName": "candidates[]" } } } } }, // 第三步:过滤掉空字符串和null值 { "operation": "modify-overwrite-beta", "spec": { "candidates": "=filterNull", "candidates": "=filterEmpty" } }, // 第四步:取第一个非空值作为systemName { "operation": "shift", "spec": { "candidates": { "0": "systemName" } } } ]
规则说明
- 统一格式:通过
shift操作,不管insertEvent是对象还是数组,都转为数组结构。"*": "insertEvent[]"处理数组元素,"@": "insertEvent[]"处理单个对象。 - 收集候选值:遍历所有
insertEvent元素,把两个目标字段的值都存入candidates数组。 - 过滤空值:用
modify-overwrite-beta结合filterNull和filterEmpty,移除数组中的空字符串和null。 - 提取首个有效值:取过滤后
candidates数组的第一个元素,作为最终的systemName输出。
验证结果
把上述Jolt规则分别应用到两种输入上,都能得到符合预期的输出。
内容的提问来源于stack exchange,提问作者Prasad S Deshpande
相关产品推荐
相关产品推荐

