使用Jolt转换含子数组的JSON为带父属性的父元素数组
Jolt转换:将嵌套JSON数组展开为含完整父属性的数组
需求
将包含多层子数组的JSON转换为数组,每个数组元素对应原JSON中的一个Employee对象,同时完整保留其所属的Transmission和Employer层级属性。
输入JSON
{ "Transmission": { "TransmissionGUID": "transId1", "Employer": [ { "EmployerPartyID": "employerId1", "Employee": [ { "EmployeeGenderCode": "M", "MaritalStatusCode": "Married" }, { "EmployeeGenderCode": "F", "MaritalStatusCode": "UnMarried" } ] }, { "EmployerPartyID": "employerId2", "Employee": [ { "EmployeeGenderCode": "M2", "MaritalStatusCode": "Married2" }, { "EmployeeGenderCode": "F2", "MaritalStatusCode": "UnMarried" } ] } ] } }
期望输出JSON
[ { "Transmission": { "TransmissionGUID": "transId1", "Employer": [ { "EmployerPartyID": "employerId1", "Employee": [ { "EmployeeGenderCode": "M", "MaritalStatusCode": "Married" } ] } ] } }, { "Transmission": { "TransmissionGUID": "transId1", "Employer": [ { "EmployerPartyID": "employerId1", "Employee": [ { "EmployeeGenderCode": "F", "MaritalStatusCode": "UnMarried" } ] } ] } }, { "Transmission": { "TransmissionGUID": "transId1", "Employer": [ { "EmployerPartyID": "employerId2", "Employee": [ { "EmployeeGenderCode": "M2", "MaritalStatusCode": "Married2" } ] } ] } }, { "Transmission": { "TransmissionGUID": "transId1", "Employer": [ { "EmployerPartyID": "employerId2", "Employee": [ { "EmployeeGenderCode": "F2", "MaritalStatusCode": "UnMarried" } ] } ] } } ]
尝试的Jolt Spec(无效)
[ { "operation": "shift", "spec": { "Transmission": { "Employer": { "*": { "Employee": { "*": { "@(4,TransmissionGUID)": "[].Transmission.TransmissionGUID", "@(2,EmployerPartyID)": "[].Transmission.Employer[].EmployerPartyID", "@": "[].Transmission.Employer[].Employee[]" } } } } } } } ]
问题分析
原Spec的核心问题是使用[]作为数组索引时,会将所有属性追加到同一个数组元素中,无法为每个Employee生成独立的对象条目;同时Employee[]会将多个员工对象塞到同一个数组里,不符合期望输出的单元素数组结构。
修正后的Jolt Spec
[ { "operation": "shift", "spec": { "Transmission": { // 临时存储顶层TransmissionGUID "TransmissionGUID": "temp_trans_guid", "Employer": { "*": { // 按Employer索引存储对应的EmployerPartyID "EmployerPartyID": "temp_employer_id[&1]", "Employee": { "*": { // 用Employer索引(&3)和Employee索引(&1)组合生成唯一数组键,确保每个Employee对应独立条目 "@(4,temp_trans_guid)": "[&3_&1].Transmission.TransmissionGUID", "@(2,temp_employer_id[&3])": "[&3_&1].Transmission.Employer[0].EmployerPartyID", // 将当前Employee对象放入单元素数组 "@": "[&3_&1].Transmission.Employer[0].Employee[0]" } } } } } } }, // 清理临时变量 { "operation": "remove", "spec": { "temp_trans_guid": "", "temp_employer_id": "" } } ]
说明
- 临时存储:先把顶层的
TransmissionGUID和每个Employer的EmployerPartyID存入临时变量,方便后续引用。 - 唯一索引:通过
&3_&1(&3是当前Employer的数组索引,&1是当前Employee的数组索引)生成唯一的数组键,确保每个Employee对应一个独立的输出对象。 - 单元素数组:将
Employer和Employee都处理为单元素数组,完全匹配期望输出的结构。
内容的提问来源于stack exchange,提问作者tys
相关产品推荐
相关产品推荐

