如何修改Jolt Spec实现Ids与OtherIds的数组合并?
问题:JSON键映射与数组元素添加的Jolt Spec优化
需求概述
我正尝试将JSON中的键映射为其他键的值,并向目标数组中添加元素。需要兼容以下两种输入场景,生成对应的期望输出。
场景1:输入JSON
{ "Name": { "PRI": { "firstName": "Joe" } }, "Ids": { "IND": { "IND-ADR": { "id": "ind-adr-id", "key": "ind1" }, "IND-PAN": { "id": "ind-pan-id", "key": "ind2" } }, "USA": { "USA-SSN": { "id": "usa-ssn-id", "key": "usa1" } } }, "OtherIds": { "1970-01-01": { "0": { "idLast": "2023" } } } }
场景2:输入JSON
{ "Name": { "PRI": { "firstName": "Joe" } }, "OtherIds": { "1970-01-01": { "0": { "idLast": "2023" } } } }
期望输出
场景1期望输出
{ "Name" : { "PRI" : { "firstName" : "Joe" } }, "Ids" : [ { "country" : "IND", "IdType" : "IND-ADR", "id" : "ind-adr-id", "key" : "ind1" }, { "country" : "IND", "IdType" : "IND-PAN", "id" : "ind-pan-id", "key" : "ind2" }, { "country" : "USA", "IdType" : "USA-SSN", "id" : "usa-ssn-id", "key" : "usa1" }, { //from OtherIds "country" : "USA", // hard-coding this "IdType" : "SSN Tail", //hard-coding this "idLast" : "2023" } ] }
场景2期望输出
{ "Name" : { "PRI" : { "firstName" : "Joe" } }, "Ids" : [ {//from OtherIds "country" : "USA", // hard-coding this "IdType" : "SSN Tail", //hard-coding this "idLast" : "2023" } ] }
当前Jolt Spec及输出
当前Jolt Spec
[ { "operation": "shift", "spec": { "Ids": { "*": { "*": { "$1": "NID.&2_&1.&3.country", "$": "NID.&2_&1.&3.IdType", "*": "NID.&2_&1.&3.&" } } }, "*": "&" } }, { "operation": "shift", "spec": { "NID": { "*": { "*": { "*": "&1[#3].&" } } }, "*": "&" } } ]
当前输出
{ "Name" : { "PRI" : { "firstName" : "Joe" } }, "Ids" : [ { "country" : "IND", "IdType" : "IND-ADR", "id" : "ind-adr-id", "key" : "ind1" }, { "country" : "IND", "IdType" : "IND-PAN", "id" : "ind-pan-id", "key" : "ind2" }, { "country" : "USA", "IdType" : "USA-SSN", "id" : "usa-ssn-id", "key" : "usa1" } ], "OtherIds" : { "1970-01-01" : { "0" : { "idLast" : "2023" } } } }
修改后的Jolt Spec
可以通过调整shift操作,将OtherIds中的数据整合到Ids数组中,同时兼容两种场景:
[ { "operation": "shift", "spec": { "Ids": { "*": { "*": { "$1": "Ids[#2].country", "$": "Ids[#2].IdType", "*": "Ids[#2].&" } } }, "OtherIds": { "*": { "*": { "'USA'": "Ids[-1].country", "'SSN Tail'": "Ids[-1].IdType", "*": "Ids[-1].&" } } }, "Name": "&" } } ]
说明
- 处理
Ids部分:通过#2获取层级索引,将每个子项映射到Ids数组的对应位置,自动生成数组元素。 - 处理
OtherIds部分:使用-1将其数据追加到Ids数组的末尾,同时硬编码country为USA、IdType为SSN Tail。 - 保留
Name字段不变,无论输入是否包含Ids,都能正确生成包含OtherIds数据的Ids数组。
内容的提问来源于stack exchange,提问作者Aditya Ashok
相关产品推荐
相关产品推荐

