Jolt数组转换问题:仅保留最后元素,求正确转换方案
Jolt JSON转换问题排查与解决
问题背景
输入JSON
{ "steps": [ { "end": "2023-01-27T09:19:29.849298Z", "id": "1", "start": "2023-01-27T09:18:24.59325Z", "name": "foo" }, { "end": "2023-01-28T09:19:29.849298Z", "id": "2", "start": "2023-01-28T09:18:24.59325Z", "name": "bar" } ] }
期望输出JSON
{ "steps": [ { "end": "2023-01-27T09:19:29.849298Z", "id": "1", "name": "foo", "start": "2023-01-27T09:18:24.59325Z" }, { "end": "2023-01-28T09:19:29.849298Z", "id": "2", "name": "bar", "start": "2023-01-28T09:18:24.59325Z" } ], "date": [ { "name": "startDate", "value": "2023-01-27T09:18:24.59325Z" }, { "name": "endDate", "value": "2023-01-27T09:19:29.849298Z" } ] }
尝试的Jolt Spec
[ { "operation": "shift", "spec": { "steps": { "*": "steps[]", "0": { "#startDate": "date[0].name", "start": "date[0].value", "end": "date[1].value", "#endDate": "date[1].name" } } } } ]
遇到的问题
上述Spec中,"*": "steps[]"仅保留了steps数组的最后一个元素,无法得到期望的完整steps数组结构。
问题原因
Jolt的Shift操作中,具体索引(如"0")的匹配优先级高于通配符"*"。当两者在同一父节点下共存时,索引0的元素只会被"0"对应的规则处理,而该规则中没有将索引0的元素映射到steps数组;只有索引1的元素会被"*"规则存入steps[],最终导致steps数组仅保留最后一个元素。
正确解决方案
方案一:在Shift操作中同时处理所有元素与日期字段
通过明确指定每个steps元素的字段映射,同时处理索引0的日期提取,既保留完整的steps数组,又生成date节点:
[ { "operation": "shift", "spec": { "steps": { "*": { // 按期望顺序映射steps元素的所有字段 "end": "steps[&1].end", "id": "steps[&1].id", "name": "steps[&1].name", "start": "steps[&1].start" }, "0": { "#startDate": "date[0].name", "start": "date[0].value", "#endDate": "date[1].name", "end": "date[1].value" } } } } ]
方案二:结合Shift与Sort操作(更简洁)
先通过Shift保留完整的steps数组并提取date字段,再用Sort操作调整steps内的字段顺序,更符合期望输出的格式:
[ { "operation": "shift", "spec": { "steps": { "*": "steps[]", // 保留所有steps元素 "0": { "#startDate": "date[0].name", "start": "date[0].value", "#endDate": "date[1].name", "end": "date[1].value" } } } }, { "operation": "sort", "spec": { "steps": { "*": { // 指定字段排序顺序 "": ["end", "id", "name", "start"] } } } } ]
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

