协助排查Jolt转换Spec错误,实现预期JSON格式转换
Jolt转换规则错误排查与修正
输入JSON
[ { "external_id": 855644012615, "order_id": 4551472709703, "processed_at": "2022-08-30T02:40:26-04:00", "tracking_number": 4.201110410179302e+24, "refund_line_items": [ { "order_line_item_id": 11544859803719, "quantity": 6, "line_item": { "name": "FLORENCIA RED MULTI - RED MULTI / 6 / 634", "product_id": 6586562773063, "properties": [ { "name": "UPCA", "value": "195945037714" } ] } } ] } ]
预期输出
[ { "externalId" : 855644012615, "orderExternalId" : 4551472709703, "partyIdFrom" : "NA", "destinationFacilityId" : "", "partyIdTo" : "NA", "status" : "PURCH_SHIP_CREATED", "type" : "SALES_RETURN", "estimatedShipCost" : "0", "packages" : [ { "packageSeqId" : "", "trackingCode" : 4.201110410179302E24, "items" : [ { "sku" : "195945037714", "quantity" : 6 } ] } ] } ]
当前使用的Jolt转换规则
[ { "operation": "default", "spec": { "*": { "partyIdFrom": "_NA_", "destinationFacilityId": "", "externalPartyIdFrom": "", "partyIdTo": "_NA_", "status": "PURCH_SHIP_CREATED", "type": "SALES_RETURN", "estimatedShipCost": "0", "packageSeqId": "" } } }, { "operation": "shift", "spec": { "*": { "external_id": "[&1].externalId", "order_id": "[&1].orderExternalId", "partyIdFrom": "[&1].partyIdFrom", "destinationFacilityId": "[&1].destinationFacilityId", "partyIdTo": "[&1].partyIdTo", "status": "[&1].status", "type": "[&1].type", "estimatedShipCost": "[&1].estimatedShipCost", "packageSeqId": "[&1].packages[&1].packageSeqId", "tracking_number": "[&1].packages[&1].trackingCode", "refund_line_items": { "*": { "quantity": "[&2].packages[#5].items[&3].quantity", "line_item": { "properties": { "*": { "value": "[&6].packages[#4].items[&1].sku" } } } } } } } } ]
错误分析
- 默认值不匹配:
partyIdFrom和partyIdTo设置为"_NA_",但预期输出是"NA",多了下划线。 - packages数组索引错误:shift操作中用
[&1]作为packages的索引,会对应外层数组的元素索引,而每个订单仅对应一个package,应该用固定索引[0]避免索引混乱。 - 层级引用计算错误:
refund_line_items下的quantity和sku路径使用了错误的相对层级符号(如[#5]、[&6]),导致无法正确映射到packages下的items数组。
修正后的Jolt转换规则
[ { "operation": "default", "spec": { "*": { "partyIdFrom": "NA", "destinationFacilityId": "", "partyIdTo": "NA", "status": "PURCH_SHIP_CREATED", "type": "SALES_RETURN", "estimatedShipCost": "0", "packageSeqId": "" } } }, { "operation": "shift", "spec": { "*": { "external_id": "[&1].externalId", "order_id": "[&1].orderExternalId", "partyIdFrom": "[&1].partyIdFrom", "destinationFacilityId": "[&1].destinationFacilityId", "partyIdTo": "[&1].partyIdTo", "status": "[&1].status", "type": "[&1].type", "estimatedShipCost": "[&1].estimatedShipCost", "packageSeqId": "[&1].packages[0].packageSeqId", "tracking_number": "[&1].packages[0].trackingCode", "refund_line_items": { "*": { "quantity": "[&2].packages[0].items[&1].quantity", "line_item": { "properties": { "*": { "value": "[&5].packages[0].items[&3].sku" } } } } } } } } ]
修正说明
- 调整
default操作里的partyIdFrom和partyIdTo值为"NA",去掉多余下划线。 - 将packages数组的索引固定为
[0],确保每个订单对应唯一的package对象。 - 修正
refund_line_items下的相对路径:quantity路径改为[&2].packages[0].items[&1].quantity,&2回到外层订单对象层级,&1对应refund_line_items的元素索引。sku路径改为[&5].packages[0].items[&3].sku,&5回到外层订单对象层级,&3对应refund_line_items的元素索引,确保和quantity映射到同一个items元素。
内容的提问来源于stack exchange,提问作者Yamini Bhagat
相关产品推荐
相关产品推荐

