JOLT转换需求:相同ID的ORG_LVL_2需归至同一OrgUnits数组
修正JOLT规范实现按ID聚合ORG_LVL_2编码
问题背景
需要将输入JSON通过JOLT转换为指定的输出JSON,核心需求是同一id对应的多个ORG_LVL_2编码需归属到同一个orgUnits数组下,但现有JOLT规范无法实现,会为每个ORG_LVL_2创建独立对象。
输入JSON
[ { "id": "0000606800", "ORG_LVL_2": "Co0053" }, { "id": "0000606800", "ORG_LVL_2": "Co0054" }, { "id": "0000609480", "ORG_LVL_2": "Co0055" } ]
预期输出JSON
{ "IntegrationEntities": { "integrationEntity": [ { "integrationEntityHeader": { "referenceCodeForEntity": "test" }, "integrationEntityDetails": { "glAccount": { "id": "0000606800", "orgUnits": { "orgUnitAssignment": [ { "orgUnitDetails": [ { "orgUnitLevel": "ORG_LVL_1", "orgUnitCode": "C01" }, { "orgUnitLevel": "ORG_LVL_2", "orgUnitCode": "Co0053" } ] }, { "orgUnitDetails": [ { "orgUnitLevel": "ORG_LVL_1", "orgUnitCode": "C01" }, { "orgUnitLevel": "ORG_LVL_2", "orgUnitCode": "Co0054" } ] } ] } } } }, { "integrationEntityHeader": { "referenceCodeForEntity": "test" }, "integrationEntityDetails": { "glAccount": { "id": "0000609480", "orgUnits": { "orgUnitAssignment": [ { "orgUnitDetails": [ { "orgUnitLevel": "ORG_LVL_1", "orgUnitCode": "C01" }, { "orgUnitLevel": "ORG_LVL_2", "orgUnitCode": "Co0055" } ] } ] } } } } ] } }
当前无法满足需求的JOLT规范
[ { "operation": "shift", "spec": { "*": { "#test": "IntegrationEntities.integrationEntity.[&1].integrationEntityHeader.referenceCodeForEntity", "id": "IntegrationEntities.integrationEntity.[&1].integrationEntityDetails.glAccount.id", "#ORG_LVL_1": "IntegrationEntities.integrationEntity.[&1].integrationEntityDetails.glAccount.orgUnits.orgUnitAssignment.orgUnitDetails.[0].orgUnitLevel", "#CO1": "IntegrationEntities.integrationEntity.[&1].integrationEntityDetails.glAccount.orgUnits.orgUnitAssignment.orgUnitDetails.[0].orgUnitCode", "#ORG_LVL_2": "IntegrationEntities.integrationEntity.[&1].integrationEntityDetails.glAccount.orgUnits.orgUnitAssignment.orgUnitDetails.[1].orgUnitLevel", "ORG_LVL_2": "IntegrationEntities.integrationEntity.[&1].integrationEntityDetails.glAccount.orgUnits.orgUnitAssignment.orgUnitDetails.[1].orgUnitCode" } } }, { "operation": "shift", "spec": { "IntegrationEntities": { "integrationEntity": { "*": { "integrationEntityHeader": { "referenceCodeForEntity": "IntegrationEntities.integrationEntity.[&2].integrationEntityHeader.referenceCodeForEntity" }, "integrationEntityDetails": { "glAccount": { "id": "IntegrationEntities.integrationEntity.[&3].integrationEntityDetails.glAccount.id", "orgUnits": "IntegrationEntities.integrationEntity.[&3].integrationEntityDetails.glAccount.orgUnits" } } } } } } } ]
修正后的JOLT规范
[ // 第一步:按id分组,聚合同一id下的ORG_LVL_2到数组 { "operation": "shift", "spec": { "*": { "id": "tempGroupedByID.&1.id", "ORG_LVL_2": "tempGroupedByID.&1.orgLvl2List[]" } } }, // 第二步:转换为目标格式,为每个ORG_LVL_2生成独立的orgUnitAssignment项 { "operation": "shift", "spec": { "tempGroupedByID": { "*": { "#test": "IntegrationEntities.integrationEntity.[&1].integrationEntityHeader.referenceCodeForEntity", "id": "IntegrationEntities.integrationEntity.[&1].integrationEntityDetails.glAccount.id", "orgLvl2List": { "*": { "@": "IntegrationEntities.integrationEntity.[&3].integrationEntityDetails.glAccount.orgUnits.orgUnitAssignment.[&1].orgUnitDetails[1].orgUnitCode", "#ORG_LVL_2": "IntegrationEntities.integrationEntity.[&3].integrationEntityDetails.glAccount.orgUnits.orgUnitAssignment.[&1].orgUnitDetails[1].orgUnitLevel", "#ORG_LVL_1": "IntegrationEntities.integrationEntity.[&3].integrationEntityDetails.glAccount.orgUnits.orgUnitAssignment.[&1].orgUnitDetails[0].orgUnitLevel", "#C01": "IntegrationEntities.integrationEntity.[&3].integrationEntityDetails.glAccount.orgUnits.orgUnitAssignment.[&1].orgUnitDetails[0].orgUnitCode" } } } } } }, // 第三步:清理临时分组节点 { "operation": "remove", "spec": { "tempGroupedByID": "" } } ]
规范说明
- 分组阶段:通过临时节点
tempGroupedByID,将同一id对应的所有ORG_LVL_2收集到数组中,完成按id的聚合。 - 结构转换阶段:遍历每个id分组,为数组中的每个ORG_LVL_2生成一个独立的
orgUnitAssignment对象,每个对象包含固定的ORG_LVL_1信息和当前的ORG_LVL_2信息,确保同一id下的所有ORG_LVL_2归属到同一个orgUnits结构下。 - 清理阶段:移除临时创建的分组节点,得到符合预期的最终结构。
内容的提问来源于stack exchange,提问作者Alexa
相关产品推荐
相关产品推荐

