如何修正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 ', '')" } } } ]
修改说明
- 第一个shift操作:将原数组中每个
items下的子元素单独映射为新数组条目,使用[&1](当前item的索引)作为新数组的索引,确保同一原元素下的多个item不会互相覆盖,而是生成独立的临时对象。 - 第二个shift操作:直接遍历所有临时条目,筛选出
field为status的条目并放入最终数组,省去中间tmp节点,简化处理流程。 - 新增modify操作:通过字符串替换处理最后一条的
to字段,将"In Testing"转换为"Testing",匹配期望输出的格式要求。
内容的提问来源于stack exchange,提问作者Nathan Stout
相关产品推荐
相关产品推荐

