You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:50:26