Jolt转换嵌套数组异常:输入3条数据输出6条求排查
Jolt转换出现重复条目问题解决
问题根因
你遇到的输出条目从3条变6条,本质是两个嵌套数组的笛卡尔积问题:当Jolt规范中同时对files.file和attributes.attribute这两个数组进行数组层级的映射时,Jolt会将每个listing下的file元素和attribute元素做全组合匹配,最终生成的条目数是file数量 × attribute数量,导致原本的3条listing被扩展翻倍。
修正思路
要避免笛卡尔积,必须把嵌套数组的处理限制在单个listing的上下文内:先遍历顶层的listing数组,再在每个listing内部分别处理files.file和attributes.attribute,不让两个数组的遍历逻辑交叉触发。
示例修正方案
假设你的输入JSON是XML转换后的典型结构:
{ "listings": { "listing": [ { "id": "1", "files": { "file": [{"name": "a.jpg"}] }, "attributes": { "attribute": [ {"@attributes": {"key": "color", "value": "red"}} ] } }, { "id": "2", "files": { "file": [{"name": "b.png"}] }, "attributes": { "attribute": [ {"@attributes": {"key": "size", "value": "L"}} ] } }, { "id": "3", "files": { "file": [{"name": "c.pdf"}] }, "attributes": { "attribute": [ {"@attributes": {"key": "type", "value": "doc"}} ] } } ] } }
对应的正确Jolt规范如下:
[ { "operation": "shift", "spec": { "listings": { "listing": { "*": { // 保留listing顶层字段 "id": "[&1].id", // 处理files数组,将内容归属到当前listing下 "files": { "file": { "*": { "@": "[&3].files[&1]" } } }, // 处理attributes数组,提取@attributes并归属到当前listing下 "attributes": { "attribute": { "*": { "@attributes": "[&3].attributes[&1]" } } } } } } } } ]
规范关键说明
[&1]指代顶层listing数组的索引,确保每个处理结果对应原输入的单个listing[&3]在处理嵌套数组时,通过层级回溯(file → files → 当前listing)定位到原listing的索引,保证files和attributes都归属到同一个条目下- 分开处理两个嵌套数组,避免遍历逻辑交叉产生笛卡尔积
验证效果
修正后的输出会严格保留3条listing,每条包含对应的files和attributes数据,不会出现重复条目。
内容的提问来源于stack exchange,提问作者estarthr
相关产品推荐
相关产品推荐

