Search code examples
arraysjsonjolt

JOLT - Sort array objects depending on keys values


I would like to sort the objects of an array depending on specific values of 2 keys. In particular I would like to sort by a specific kpiId value, and for the objects having that kpiId value, sort by the simulationId values. This iterates twice.

Input

{
  "kpiResults": [
    {
      "simulationId": 3939,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 2
    },
    {
      "simulationId": 3936,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 1
    },
    {
      "simulationId": 3940,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 12
    },
    {
      "simulationId": 3940,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 88
    },
    {
      "simulationId": 3937,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 32
    },
    {
      "simulationId": 3939,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 11
    },
    {
      "simulationId": 3938,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 12
    },
    {
      "simulationId": 3938,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 6
    },
    {
      "simulationId": 3936,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 4
    },
    {
      "simulationId": 3937,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 21
    }
  ]
}

Desired Output (sort by kpiId=80,simulationId then sort by kpiId=81,simulationId)

{
  "kpiResults": [
    {
      "simulationId": 3936,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 1
    },
    {
      "simulationId": 3937,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 32
    },
    {
      "simulationId": 3938,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 12
    },
    {
      "simulationId": 3939,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 11
    },
    {
      "simulationId": 3940,
      "kpiId": 80,
      "startTime": "2022-01-05T10:20:47",
      "value": 12
    },
    {
      "simulationId": 3936,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 4
    },
    {
      "simulationId": 3937,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 21
    },
    {
      "simulationId": 3938,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 6
    },
    {
      "simulationId": 3939,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 2
    },
    {
      "simulationId": 3940,
      "kpiId": 81,
      "startTime": "2022-01-05T10:20:47",
      "value": 88
    }
  ]
}

Any help with the required JOLT spec would be appreciated. Cheers M


Solution

  • You can apply sort transformation after making combination of kpiId and simulationId values object key names, and then remove them :

    [
      {
        "operation": "shift",
        "spec": {
          "kpiResults": {
            "*": "@(0,kpiId).@(0,simulationId)"
          }
        }
      },
      {
        "operation": "sort"
      },
      {
        "operation": "shift",
        "spec": {
          "*": {
            "*": "kpiResults"
          }
        }
      }
    ]
    

    enter image description here