如何用单条JOLT规则将多层级元素转为数组(含单个元素场景)?
JOLT转换:递归收集指定元素并始终返回数组
问题描述
需要递归遍历JSON所有层级,收集所有foo.nn字段的值到数组中,且无论匹配到1个还是多个元素,结果始终是数组结构,同时无需预先知晓JSON的层级深度。
输入示例
{ "id": 1, "item": [ { "id": "1_1", "foo": { "id": 1232, "nn": "sdfsd" } } ] }
预期输出
{ "type": ["sdfsd"] }
解决方案
使用JOLT的shift操作,结合递归通配符和数组目标语法实现需求:
[ { "operation": "shift", "spec": { "**": { // 递归匹配所有层级的节点 "foo": { "nn": "type[]" // 用type[]强制将值存入数组 } } } } ]
规则解释
**递归通配符:匹配JSON中任意层级的所有节点,无需硬编码多层item结构,自动处理未知深度的嵌套。type[]数组目标:JOLT中,当目标字段名后跟[]时,无论匹配到1个还是多个值,都会将结果包装为数组,避免单个值时输出字符串。
验证结果
针对上述输入,执行规则后输出与预期完全一致;若输入包含多个foo.nn值(比如多层嵌套的item里的foo),所有值都会被收集到type数组中。
原规则问题分析
- 硬编码多层
item结构,无法适配未知深度的JSON; - 使用
type作为目标字段,单个匹配值时JOLT会输出字符串而非数组,多个值时才自动转为数组。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

