基于id合并JSON数组数据,修复JOLT丢失nationalities数组问题
JOLT合并JSON对象并保留数组结构解决方案
需求:按id合并clubhouse数组中的对象,合并investors数组,同时保留nationalities等其他数组结构。原JOLT脚本在新增nationalities数组后丢失其结构,现提供修正方案。
原始JSON数据
{"clubhouse": [{"id": "01","statusId": "ok","stateid": "2","nationalities": [{"nationalityid": "1"},{"nationalityid": "2"},{"nationalityid": "3"}],"TypeId": "3","investors": [{"investor": {"id": "1234","gender": "01"},"inamount": "1500000","ratio": "12"}]},{"id": "01","statusId": "ok","stateid": "2","nationalities": [{"nationalityid": "1"},{"nationalityid": "2"},{"nationalityid": "3"}],"TypeId": "3","investors": [{"investor": {"id": "4321","gender": "02"},"inamount": "1700000","ratio": "12"}]},{"id": "02","statusId": "ok","stateid": "2","nationalities": [{"nationalityid": "3"},{"nationalityid": "4"},{"nationalityid": "5"}],"TypeId": "3","investors": [{"investor": {"id": "1333","gender": "01"},"inamount": "1500000","ratio": "12"}]},{"id": "03","statusId": "ok","stateid": "5","nationalities": [{"nationalityid": "3"},{"nationalityid": "4"},{"nationalityid": "5"}],"TypeId": "3","investors": [{"investor": {"id": "","gender": ""},"inamount": "","ratio": ""}]},{"id": "02","statusId": "ok","stateid": "2","nationalities": [{"nationalityid": "3"},{"nationalityid": "4"},{"nationalityid": "5"}],"TypeId": "3","investors": [{"investor": {"id": "1334","gender": "02"},"inamount": "1900000","ratio": "12"}]}]}
原JOLT脚本(存在结构丢失问题)
[{"operation": "shift","spec": {"*": {"*": {"*": "@(1,id).&","investors": {"*": {"*": {"@": "@(4,id).&3[&4].&"}}}}}}},{"operation": "modify-overwrite-beta","spec": {"*": "=recursivelySquashNulls"}},{"operation": "cardinality","spec": {"*": {"*": "ONE","investors": "MANY"}}},{"operation": "shift","spec": {"*": ""}}]
期望输出JSON
{"clubhouse": [{"id": "01","statusId": "ok","stateid": "2","nationalities": [{"nationalityid": "1"},{"nationalityid": "2"},{"nationalityid": "3"}],"TypeId": "3","investors": [{"investor": {"id": "1234","gender": "01"},"inamount": "1500000","ratio": "12"},{"investor": {"id": "4321","gender": "02"},"inamount": "1700000","ratio": "12"}]},{"id": "02","statusId": "ok","stateid": "2","nationalities": [{"nationalityid": "3"},{"nationalityid": "4"},{"nationalityid": "5"}],"TypeId": "3","investors": [{"investor": {"id": "1333","gender": "01"},"inamount": "1500000","ratio": "12"},{"investor": {"id": "1334","gender": "02"},"inamount": "1900000","ratio": "12"}]},{"id": "03","statusId": "ok","stateid": "5","nationalities": [{"nationalityid": "3"},{"nationalityid": "4"},{"nationalityid": "5"}],"TypeId": "3","investors": [{"investor": {"id": "","gender": ""},"inamount": "","ratio": ""}]}]}
修正后的JOLT脚本
[ { "operation": "shift", "spec": { "*": { "*": { "id": "@(1,id).id", "statusId": "@(1,id).statusId", "stateid": "@(1,id).stateid", "TypeId": "@(1,id).TypeId", "nationalities": "@(1,id).nationalities", "investors": { "*": "@(3,id).investors[]" } } } } }, { "operation": "modify-overwrite-beta", "spec": { "*": "=recursivelySquashNulls" } }, { "operation": "cardinality", "spec": { "*": { "id": "ONE", "statusId": "ONE", "stateid": "ONE", "TypeId": "ONE", "nationalities": "ONE", "investors": "MANY" } } }, { "operation": "shift", "spec": { "*": "clubhouse[]" } } ]
脚本说明
- 第一个shift操作:
- 对
id、statusId等单值字段,按@(1,id)作为键进行分组映射 - 直接保留
nationalities数组的完整结构到对应分组 - 用
investors[]的方式收集同id下的所有投资者元素,实现数组合并
- 对
- modify-overwrite-beta操作:递归压缩空值,可根据实际需求决定是否保留
- cardinality操作:指定单值字段只保留一个实例(同
id的这些字段值一致),investors保持多元素数组,nationalities因为同id值相同,用ONE确保只保留一份 - 最后一个shift操作:将分组后的对象重新整理为数组,并包裹到
clubhouse键下,匹配期望输出结构
内容的提问来源于stack exchange,提问作者Sinuers
相关产品推荐
相关产品推荐

