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

admin2025-04-22  2

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?

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?

Share Improve this question edited Jan 21 at 18:05 Sunnydays asked Jan 21 at 14:59 SunnydaysSunnydays 455 bronze badges
Add a comment  | 

2 Answers 2

Reset to default 1

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.

You can use the following transformation :

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&",
        "users": {
          "@1,status": {
            "PENDING|INACTIVE|BLOCKED": {
              "@": "&3"//returns "users":null if the matches with the literals above 
            },
            "*": {//if not one of the above listed cases 
              "@2": "&3"
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "~users": [] //set [] if it is null due to the ~ character
    }
  }
]

Edit : You just can remove the one level of wrapper in order to handle this new edited case :

[
  {
    "operation": "shift",
    "spec": {
      // "*": {
      "*": "&",
      "users": {
        "@1,status": {
          "PENDING|INACTIVE|BLOCKED": {
            "@": "&3"
          },
          "*": {
            "@2": "&3"
          }
        }
      }
    }
    // }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "~users": []
    }
  }
]
转载请注明原文地址:http://anycun.com/QandA/1745302099a90591.html