如何用JOLT递归转换多层嵌套modules的JSON结构?
用JOLT递归提取多层嵌套modules的所有id
问题说明
源JSON包含层级数量未知的嵌套modules结构,现有Shift操作Spec只能提取顶层id,需要生成能收集所有层级id的new_modules数组。
输入JSON
{"modules": [{"id": "1","modules": [{"id": "1.1","modules": []},{"id": "1.2","modules": [{"id": "1.2.1","modules": []}]}]},{"id": "2","modules": [{"id": "2.1","modules": []}]}]}
现有Spec(仅提取顶层id)
[{"operation": "shift","spec": {"modules": {"*": {"id": "new_modules[&1].id"}}}}]
期望输出
{"new_modules": [{"id": "1"},{"id": "1.1"},{"id": "1.2"},{"id": "1.2.1"},{"id": "2"},{"id": "2.1"}]}
解决方案:递归Shift Spec
[ { "operation": "shift", "spec": { "modules": { "*": { "id": "new_modules[]", "modules": "@recurse" } } } }, { "operation": "shift", "spec": { "new_modules": { "*": { "$": "new_modules[&1].id" } } } } ]
说明
第一个Shift操作:
- 用
"id": "new_modules[]"把每个层级的id追加到new_modules数组中,[]会自动按顺序添加元素,避免索引覆盖问题 - 用
"modules": "@recurse"递归处理当前模块下的嵌套modules结构,实现多层遍历
- 用
第二个Shift操作:
- 把
new_modules数组中的字符串id转换为{"id": "xxx"}的对象格式,匹配期望输出结构
- 把
内容的提问来源于stack exchange,提问作者Ganesh Ramachandran Nair
相关产品推荐
相关产品推荐

