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.
{
"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?
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
.