jsontransformjolt

Using Jolt specs to remove all array elements if a field has one of the values


I have a JSON like this (edited)


  {
    "status": "ACTIVE",
    "users": [
      {
        "id": "1",
        "name": "Aaron",
        "accounts": [
          {
            "id": 11,
            "value": "account_11"
          },
          {
            "id": "12",
            "value": "account_12"
          }
        ]
      },
      {
        "id": "2",
        "name": "Rodney",
        "accounts": [
          {
            "id": 22,
            "value": "account_22"
          }
        ]
      },
      {
        "id": "3",
        "name": "Clayton",
        "accounts": [
          {
            "id": 33,
            "value": "account_33"
          }
        ]
      }
    ]
  }

I want to keep the users array empty when status is "PENDING", "INACTIVE" or "BLOCKED" but not of any other value of status.

e.g.

  1. for above JSON no change
  2. for following JSON

  {
    "status": "BLOCKED",
    "users": [
      {
        "id": "1",
        "name": "Aaron",
        "accounts": [
          {
            "id": 11,
            "value": "account_11"
          },
          {
            "id": "12",
            "value": "account_12"
          }
        ]
      },
      {
        "id": "2",
        "name": "Rodney",
        "accounts": [
          {
            "id": 22,
            "value": "account_22"
          }
        ]
      },
      {
        "id": "3",
        "name": "Clayton",
        "accounts": [
          {
            "id": 33,
            "value": "account_33"
          }
        ]
      }
    ]
  }

it should result in whenever the status message has one of the expected status to empty the users array.

{
  "status": "BLOCKED",
  "users": []
}

How can this be done with Jolt specs?


Solution

  • This spec should work to achieve your transformation requirement.

    [
      {
        "operation": "shift",
        "spec": {
          "status": {
            "PENDING|INACTIVE|BLOCKED": {
              "$": "status"
            },
            "*": {
              "$": "status",
              "@(2,users)": "users"
            }
          }
        }
      },
      {
        "operation": "default",
        "spec": {
          "users": []
        }
      }
    ]
    

    If status matches PENDING, INACTIVE or BLOCKED, then only the status field is shifted, else the user object is also shifted.

    Using default operation, an empty user array will be set if it's missing, which it will be when status is PENDING, INACTIVE or BLOCKED.