Jolt规则:基于外部字段值条件映射数组内字段
Jolt条件映射解决方案
完整Jolt规则
[ { "operation": "shift", "spec": { "event": { "id": "event.id" }, "message": { "id": "message.idNbr", "conditionCode": "message.conditionCd", "data": { "*": { "id": "message.data[&1].idNbr", "field3": "message.data[&1].directField", // 根据上层conditionCode判断映射字段 "@(2,conditionCode)": { "AA": { "@(2,field1)": "message.data[&3].conditionalField" }, "BB": { "@(2,field2)": "message.data[&3].conditionalField" } } } } } } } ]
关键逻辑说明
- 回溯获取上层字段:用
@(2,conditionCode)向上回溯2层,从message节点拿到conditionCode的值(当前节点在data[*]的子层级,向上1层是数组元素,再向上1层就是message)。 - 条件分支映射:根据
conditionCode的取值,分别将数组元素的field1或field2映射到conditionalField。其中@(2,field1)用于获取当前数组元素的field1值,&3保持数组索引的对应关系(从AA/BB节点向上回溯3层到data[*],引用原数组的索引位置)。 - 保留原有字段映射:延续了原有规则中
conditionCode→conditionCd、id→idNbr、field3→directField的重命名逻辑。
验证结果
输入JSON 1(conditionCode=AA)
{ "event": { "id": "12345678" }, "message": { "id": "1001", "conditionCode": "AA", "location": "US", "data": [ { "id": "1", "field1": "value1", "field2": "value2", "field3": "value3" }, { "id": "2", "field1": "value4", "field2": "value5", "field3": "value6" } ] } }
输出JSON 1
{ "event": { "id": "12345678" }, "message": { "idNbr": "1001", "conditionCd": "AA", "data": [ { "idNbr": "1", "directField": "value3", "conditionalField": "value1" }, { "idNbr": "2", "directField": "value6", "conditionalField": "value4" } ] } }
输入JSON 2(conditionCode=BB)
{ "event": { "id": "12345678" }, "message": { "id": "1001", "conditionCode": "BB", "location": "US", "data": [ { "id": "1", "field1": "value1", "field2": "value2", "field3": "value3" }, { "id": "2", "field1": "value4", "field2": "value5", "field3": "value6" } ] } }
输出JSON 2
{ "event": { "id": "12345678" }, "message": { "idNbr": "1001", "conditionCd": "BB", "data": [ { "idNbr": "1", "directField": "value3", "conditionalField": "value2" }, { "idNbr": "2", "directField": "value6", "conditionalField": "value5" } ] } }
内容的提问来源于stack exchange,提问作者Jobin Thomas
相关产品推荐
相关产品推荐

