双层嵌套数组结构的JOLT Shift转换问题求助
JOLT Shift 解决双层嵌套数组的员工与地址关联问题
问题需求
需使用JOLT Shift将包含双层嵌套数组的输入JSON转换为指定格式输出,现有Spec无法正确关联员工与其对应地址:员工1需关联地址1、2,员工2需关联地址3、4、5。
输入JSON
{ "P": { "type": "manager", "metadata": { "id": "mgr1" }, "properties": { "firstName": "managerFirstName", "lastName": "managerLastName", "employmentId": "employmentId" }, "S": [ { "type": "employee", "metadata": { "id": "empl1" }, "properties": { "last": "employeeOneLastName", "first": "employeeOneFirstName" }, "S": [ { "type": "address", "metadata": { "identifier": "addr1" }, "properties": { "city": "addressOneCity", "street": "addressOneStreet" } }, { "type": "address", "metadata": { "id": "addr2" }, "properties": { "city": "addressTwoCity", "street": "addressTwoStreet" } } ] }, { "type": "employee", "metadata": { "id": "empl2" }, "properties": { "last": "employeeTwoLastName", "first": "employeeTwoFirstName" }, "S": [ { "type": "address", "metadata": { "id": "addr3" }, "properties": { "city": "addressThreeCity", "street": "addressThreeStreet" } }, { "type": "address", "metadata": { "id": "addr4" }, "properties": { "city": "addressFourCity", "street": "addressFourStreet" } }, { "type": "address", "metadata": { "id": "addr5" }, "properties": { "city": "addressFiveCity", "street": "addressFiveStreet" } } ] }, { "type": "officeinfo", "metadata": { "id": "office1" }, "properties": { "country": "myCountry", "city": "myCity", "employmentId": "employmentId" } } ] } }
期望输出JSON
{ "manager": { "type": "manager", "firstName": "managerFirstName", "lastName": "managerLastName", "employmentId": "employmentId", "employee": [ { "type": "employee", "lastName": "employeeOneLastName", "firstName": "employeeOneFirstName", "address": [ { "type": "address", "city": "addressOneCity", "street": "addressOneStreet" }, { "type": "address", "city": "addressTwoCity", "street": "addressTwoStreet" } ] }, { "address": [ { "city": "addressThreeCity", "street": "addressThreeStreet", "type": "address" }, { "type": "address", "city": "addressFourCity", "street": "addressFourStreet" }, { "city": "addressFiveCity", "street": "addressFiveStreet", "type": "address" } ], "type": "employee", "lastName": "employeeTwoLastName", "firstName": "employeeTwoFirstName" } ], "office": { "type": "officeinfo", "country": "myCountry", "city": "myCity", "employmentId": "employmentId" } } }
原有错误Spec
[ { "operation": "shift", "spec": { "P": { "type": "manager.&", "properties": { "firstName": "manager.firstName", "lastName": "manager.lastName", "employmentId": "manager.employmentId" }, "S": { "*": { "type": { "officeinfo": { "$": "manager.office.type" }, "employee": { "$": "manager.employee[&3].type" } }, "*": { "last": "manager.employee[&2].lastName", "first": "manager.employee[&2].firstName", "country": "manager.office.country", "city": "manager.office.city", "employmentId": "manager.office.employmentId" }, "S": { "*": { "type": "manager.employee[&3].address[&1].type", "*": { "city": "manager.employee[&2].address[&4].city", "street": "manager.employee[&2].address[&4].street" } } } } } } } }, { "operation": "modify-overwrite-beta", "spec": { "*": "=recursivelySquashNulls" } } ]
修正后的JOLT Spec
[ { "operation": "shift", "spec": { "P": { "type": "manager.type", "properties": { "*": "manager.&" }, "S": { "*": { "type": { "employee": { "$": "manager.employee[&2].type" }, "officeinfo": { "$": "manager.office.type" } }, "properties": { "last": "manager.employee[&2].lastName", "first": "manager.employee[&2].firstName", "country": "manager.office.country", "city": "manager.office.city", "employmentId": "manager.office.employmentId" }, "S": { "*": { "type": "manager.employee[&3].address[&1].type", "properties": { "*": "manager.employee[&3].address[&1].&" } } } } } } } }, { "operation": "modify-overwrite-beta", "spec": { "*": "=recursivelySquashNulls" } } ]
修正说明
- 层级索引修正:地址部分的层级引用调整为
&3对应员工数组索引,&1对应地址数组索引,确保每个员工的地址正确关联。 - 属性映射优化:明确针对
properties节点处理字段,避免通配符误匹配非目标属性;manager的属性直接用*通配符映射,简化配置。 - 结构清晰化:将员工、办公室、地址的映射逻辑拆分,避免交叉干扰,确保每个类型的字段都映射到正确位置。
内容的提问来源于stack exchange,提问作者Chau Nguyen
相关产品推荐
相关产品推荐

