Jolt变换——基于id对元素进行分组

问题描述

我正在尝试根据 id、name 和 type 对 json 元素进行分组,如下所示:

输入:

[
  {
    "itemid": "1","itemName": "coco","itemType": "brg","subitemId": "444","subitemName": "INDICATIVE"
  },{
    "itemid": "1","subitemId": "333","subitemName": "BRGS"
  },{
    "itemid": "2","itemName": "limk","itemType": "cmds","subitemId": "456","subitemName": "NMPS"
  }
]

预期输出

[
  {
    "itemid": "1","subitems": [
      {
        "subitemId": "444","subitemName": "INDICATIVE"
      },{
        "subitemId": "333","subitemName": "BRGS"
      }
    ]
  },"subitems": [
      {
        "subitemId": "456","subitemName": "NMPS"
      }
    ]
  }
]

我尝试了以下规范,但没有给出预期的输出

[
  {
    "operation": "shift","spec": {
      "*": {
        "subitemId": "subitems[&1].subitemId","subitemName": "subitems[&1].subitemName","*": "&"
      }
    }
  }
]

你能帮我吗。

解决方法

这个规范应该适合你

[
  {
    "operation": "modify-default-beta","spec": {
      "*": {
        "comp_id": "=concat(@(1,itemid),'_',@(1,itemName),itemType))"
      }
    }
  },{
    "operation": "shift","spec": {
      "*": {
        "*": "@(1,comp_id).&[]"
      }
    }
  },"spec": {
      "*": {
        "*": "[#2].&","comp_id": null
      }
    }
  },{
    "operation": "modify-overwrite-beta","spec": {
      "*": {
        "itemid": "=firstElement(@(1,itemid))","itemName": "=firstElement(@(1,itemName))","itemType": "=firstElement(@(1,"spec": {
      "*": {
        "*": "[&1].&","subitemId": {
          "*": "[&2].subitems[&].subitemId"
        },"subitemName": {
          "*": "[&2].subitems[&].subitemName"
        }
      }
    }
  }
]

使用 https://jolt-demo.appspot.com 测试

尝试通过操作来检查它。