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

如何修正Jolt转换规则以提取嵌套数组中的状态变更数据?

问题:修正Jolt规范以处理多元素items数组的状态转换

输入JSON

[{
    "id": "11500887",
    "created": "2023-03-16T18:34:24.485+0200",
    "items": [{
        "field": "status",
        "fieldtype": "jira",
        "fieldId": "status",
        "from": "10000",
        "fromString": "In Definition",
        "to": "1",
        "toString": "Open"
    }]
}, {
    "id": "11500905",
    "created": "2023-03-16T18:35:05.552+0200",
    "items": [{
        "field": "status",
        "fieldtype": "jira",
        "fieldId": "status",
        "from": "1",
        "fromString": "Open",
        "to": "10001",
        "toString": "Committed"
    }]
}, {
    "id": "11500907",
    "created": "2023-03-16T18:35:11.634+0200",
    "items": [{
        "field": "status",
        "fieldtype": "jira",
        "fieldId": "status",
        "from": "10001",
        "fromString": "Committed",
        "to": "3",
        "toString": "In Progress"
    }]
}, {
    "id": "12223186",
    "created": "2023-05-03T00:55:00.323+0300",
    "items": [{
        "field": "resolution",
        "fieldtype": "jira",
        "fieldId": "resolution",
        "from": null,
        "fromString": null,
        "to": "10008",
        "toString": "Done"
    }, {
        "field": "status",
        "fieldtype": "jira",
        "fieldId": "status",
        "from": "3",
        "fromString": "In Progress",
        "to": "10018",
        "toString": "In Testing"
    }]
}]

期望输出JSON

[{
    "date": "2023-03-16T18:34:24.485+0200",
    "field": "status",
    "from": "In Definition",
    "to": "Open"
}, {
    "date": "2023-03-16T18:35:05.552+0200",
    "field": "status",
    "from": "Open",
    "to": "Committed"
}, {
    "date": "2023-03-16T18:35:11.634+0200",
    "field": "status",
    "from": "Committed",
    "to": "In Progress"
}, {
    "date": "2023-05-03T00:55:00.323+0300",
    "field": "status",
    "from": "In Progress",
    "to": "Testing"
}]

当前使用的Jolt规范

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "items": {
          "*": {
            "@2,created": "[&3].date",
            "field": "[&3].field",
            "fromString": "[&3].from",
            "toString": "[&3].to"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "field": {
          "status": {
            "@2": "tmp.[]"
          }
        }
      }
    }
  },
  {
    "operation": "default",
    "spec": {
      "tmp": []
    }
  },
  {
    "operation": "shift",
    "spec": {
      "tmp": [""]
    }
  }
]

问题

当前规范仅在items数组仅有一个元素时生效,当原数据中存在多元素items数组时,会丢失其中的状态变更条目(如最后一条状态转换)。


解决方案

修正后的Jolt规范如下:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "items": {
          "*": {
            "@2,created": "[&1].date",
            "field": "[&1].field",
            "fromString": "[&1].from",
            "toString": "[&1].to"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "field": {
            "status": {
              "@2": "[]"
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "to": "=replace(@(1,to), 'In ', '')"
      }
    }
  }
]

修改说明

  1. 第一个shift操作:将原数组中每个items下的子元素单独映射为新数组条目,使用[&1](当前item的索引)作为新数组的索引,确保同一原元素下的多个item不会互相覆盖,而是生成独立的临时对象。
  2. 第二个shift操作:直接遍历所有临时条目,筛选出field为status的条目并放入最终数组,省去中间tmp节点,简化处理流程。
  3. 新增modify操作:通过字符串替换处理最后一条的to字段,将"In Testing"转换为"Testing",匹配期望输出的格式要求。

内容的提问来源于stack exchange,提问作者Nathan Stout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:17:34