如何通过Jolt转换处理含嵌套数组的嵌套对象
Jolt规格调整:实现单明细项独立detail元素
输入数据
[ { "MAIN": { "SCALE": "N", "TAX": "INV", "DETAIL_GROUP": [ { "ORDER_GROUP": "LD6", "CENTRAL_TP": [ { "LEG_DETAILS": [ { "DETAIL_LINE": [ { "ORDER_LINE": "L6", "DETAILS": [ { "AMOUNT": 1, "QTY": 1, "REGION": "EMEA" } ] }, { "DETAILS": [ { "AMOUNT": 2, "QTY": 2, "REGION": "EMEA" } ] } ] }, { "DETAIL_LINE": [ { "DETAILS": [ { "AMOUNT": 3, "QTY": 3, "REGION": "EMEA" } ] }, { "DETAILS": [ { "AMOUNT": 4, "QTY": 4, "REGION": "EMEA" } ] } ] }, { "DETAIL_LINE": [ { "DETAILS": [ { "AMOUNT": 5, "QTY": 5, "REGION": "EMEA" } ] } ] }, { "DETAIL_LINE": [ { "DETAILS": [ { "AMOUNT": 6, "QTY": 6, "REGION": "EMEA" } ] } ] } ] } ] } ] } } ]
当前使用的Shift规格
[ { "operation": "shift", "spec": { "*": { "@MAIN": { "@DETAIL_GROUP": { "*": { "@ORDER_GROUP": "detail[&2].orderGrouop", "@CENTRAL_TP": { "*": { "@LEG_DETAILS": { "*": { "@DETAIL_LINE": { "*": { "@ORDER_LINE": "detail[&2].orderLine", "@DETAILS": { "*": { "@AMOUNT": "detail[&2].itemInfo.adjustment", "@QTY": "detail[&2].itemInfo.quantity", "REGION": { "#region": "detail[&4].itemInfo.additionalInfo[0].property", "@": "detail[&4].itemInfo.additionalInfo[0].value" } } } } } } } } } } } } } } } ]
当前实际输出
{ "detail": [ { "orderGrouop": "LD6", "orderLine": "L6", "itemInfo": { "adjustment": [ 1, 3, 5, 6 ], "quantity": [ 1, 3, 5, 6 ], "additionalInfo": [ { "property": [ "region", "region", "region", "region" ], "value": [ "EMEA", "EMEA", "EMEA", "EMEA" ] } ] } }, { "itemInfo": { "adjustment": [ 2, 4 ], "quantity": [ 2, 4 ], "additionalInfo": [ { "property": [ "region", "region" ], "value": [ "EMEA", "EMEA" ] } ] } } ] }
预期输出
{ "detail": [ { "orderGrouop": "LD6", "orderLine": "L6", "itemInfo": { "adjustment": 1, "quantity": 1, "additionalInfo": [ { "property": "region", "value": "EMEA" } ] } }, { "orderGrouop": "LD6", "orderLine": "L6", "itemInfo": { "adjustment": 2, "quantity": 2, "additionalInfo": [ { "property": "region", "value": "EMEA" } ] } }, { "orderGrouop": "LD6", "orderLine": "L6", "itemInfo": { "adjustment": 3, "quantity": 3, "additionalInfo": [ { "property": "region", "value": "EMEA" } ] } }, { "itemInfo": { "adjustment": 4, "quantity": 4, "additionalInfo": [ { "property": "region", "value": "EMEA" } ] } }, { "itemInfo": { "adjustment": 5, "quantity": 5, "additionalInfo": [ { "property": "region", "value": "EMEA" } ] } }, { "itemInfo": { "adjustment": 6, "quantity": 6, "additionalInfo": [ { "property": "region", "value": "EMEA" } ] } } ] }
调整后的Jolt Shift规格
[ { "operation": "shift", "spec": { "*": { "MAIN": { "DETAIL_GROUP": { "*": { "ORDER_GROUP": "&4.detail[&3].orderGrouop", "CENTRAL_TP": { "*": { "LEG_DETAILS": { "*": { "DETAIL_LINE": { "*": { "ORDER_LINE": "&6.detail[&5].orderLine", "DETAILS": { "*": { "AMOUNT": "&7.detail[&6].itemInfo.adjustment", "QTY": "&7.detail[&6].itemInfo.quantity", "REGION": { "#region": "&9.detail[&8].itemInfo.additionalInfo[0].property", "@": "&9.detail[&8].itemInfo.additionalInfo[0].value" } } } } } } } } } } } } } } } ]
规格说明
- 核心逻辑是将最内层的每个
DETAILS数组元素映射为独立的detail数组项,通过&N层级引用向上获取上层的ORDER_GROUP和ORDER_LINE值,确保每个明细项继承对应上级属性。 - 移除原规格中多余的
@引用,直接按原始JSON层级路径匹配,避免层级混乱。 - 每个
DETAILS元素对应一个独立的detail数组索引,Jolt会自动为每个明细生成单独的数组元素,而非合并到同一元素中。 - 若上层节点(如
ORDER_LINE)不存在,对应字段不会出现在输出的detail项中,完全匹配预期格式。
内容的提问来源于stack exchange,提问作者Prasad S Deshpande
相关产品推荐
相关产品推荐

