如何处理JSON嵌套数组?实现候选邮箱与应用信息关联转换
解决JSON嵌套数组展开的Jolt Shift规范问题
输入JSON
{ "Content": [ { "CandidateEmail": "john1@noexist.com", "Applications": [ { "ApplicationId": "app1", "JobRefNumber": "REF1" }, { "ApplicationId": "app2", "JobRefNumber": "REF2" } ] }, { "CandidateEmail": "carl2@email.com", "Applications": [ { "ApplicationId": "app3", "JobRefNumber": "REF3" }, { "ApplicationId": "app4", "JobRefNumber": "REF4" } ] } ] }
期望输出JSON
[ { "CandidateEmail": "john1@noexist.com", "ApplicationId": "app1", "JobRefNumber": "REF1" }, { "CandidateEmail": "john1@noexist.com", "ApplicationId": "app2", "JobRefNumber": "REF2" }, { "CandidateEmail": "carl2@email.com", "ApplicationId": "app3", "JobRefNumber": "REF3" }, { "CandidateEmail": "carl2@email.com", "ApplicationId": "app4", "JobRefNumber": "REF4" } ]
原有规范的问题
你草拟的shift规范中,使用[&1]作为数组索引,这里的&1指向当前Applications数组的元素索引(每个Candidate下的Applications都是从0开始计数),导致第二个Candidate的Applications元素会覆盖第一个Candidate的同索引元素,最终只能得到2个结果,而非期望的4个。
修正后的Jolt规范
方案一:组合索引+扁平化(清晰直观)
[ { "operation": "shift", "spec": { "Content": { "*": { "Applications": { "*": { "@(2,CandidateEmail)": "[&2_&1].CandidateEmail", "ApplicationId": "[&2_&1].ApplicationId", "JobRefNumber": "[&2_&1].JobRefNumber" } } } } } }, { "operation": "shift", "spec": { "*": "[]" } } ]
- 第一步shift:用
&2(Content数组的索引)和&1(Applications数组的索引)组合成唯一键名(如0_0、0_1),将每个CandidateEmail与对应Application字段绑定 - 第二步shift:将所有键对应的对象扁平化到数组中
方案二:自动追加数组项(简洁高效)
[ { "operation": "shift", "spec": { "Content": { "*": { "Applications": { "*": { "@(2,CandidateEmail)": "[#4].CandidateEmail", "*": "[#4].&" } } } } } } ]
#4表示当前路径中第4个层级的通配符遍历计数(从1开始数:1=根,2=Content,3=Content的*,4=Applications的*),确保每个合并后的对象对应唯一的数组位置*匹配ApplicationId和JobRefNumber字段,直接映射到同数组项的对应键名
内容的提问来源于stack exchange,提问作者ElielBerra
相关产品推荐
相关产品推荐

