Jolt filtering - remove identical elements from JSON with a dynamic number inside

Viewed 35

I'm kinda struggling with Jolt filtering. I'm trying to remove some nodes from a nested JSON.

Here is my case:

JSON I have:

{
  "message": {
    "header": {
      "something": "something"
    },
    "payload": {
      "decisions": [
        {
          "sequenceId": "1",
          "decision": "service1",
          "something": "something"
        },
        {
          "sequenceId": "2",
          "decision": "service2",
          "something": "something"
        },
        {
          "sequenceId": "3",
          "decision": "serviceToDelete",
          "something": "something"
        }
      ],
      "elements": [
        {
          "serviceName": "service1",
          "something": "something"
        },
        {
          "serviceName": "service2",
          "something": "something"
        },
        {
          "serviceName": "serviceToDelete",
          "something": "something"
        }
      ]
    },
    "workflow": {
      "Same String[1].ServiceId": "service1",
      "Same String[1].StatusCode": "R0401",
      "Same String[1].Decision.sequenceId": "1",
      "Same String[2].ServiceId": "service2",
      "Same String[2].StatusCode": "R0401",
      "Same String[2].Decision.sequenceId": "2",
      "Same String[3].ServiceId": "serviceToDelete",
      "Same String[3].StatusCode": "R0401",
      "Same String[3].Decision.sequenceId": "3"
    }
  },
  "feedbacks": [],
  "status": []
}

Expected Output:

{
  "message": {
    "header": {
      "something": "something"
    },
    "payload": {
      "decisions": [
        {
          "sequenceId": "1",
          "decision": "service1",
          "something": "something"
        },
        {
          "sequenceId": "2",
          "decision": "service2",
          "something": "something"
        }
      ],
      "elements": [
        {
          "serviceName": "service1",
          "something": "something"
        },
        {
          "serviceName": "service2",
          "something": "something"
        }
      ]
    },
    "workflow": {
      "Same String[1].ServiceId": "service1",
      "Same String[1].StatusCode": "R0401",
      "Same String[1].Decision.sequenceId": "1",
      "Same String[2].ServiceId": "service2",
      "Same String[2].StatusCode": "R0401",
      "Same String[2].Decision.sequenceId": "2"
    }
  },
  "feedbacks": [],
  "status": []
}

For now I have the below Jolt config and I managed to remove the nodes from "decisions" and "elements" but I can't figure out how to remove the information in "workflow", based on "sequenceId", which will be different every time, we can take the value from "decisions"

Jolt filter:

[
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "message": {
        "*": "&1.&",
        "payload": {
          "*": "&",
          "decisions": {
            "*": {
              "decision": {
                "serviceToDelete": null,
                "*": {
                  "@2": "&6.decisions"
                }
              }
            }
          },
          "elements": {
            "*": {
              "serviceName": {
                "serviceToDelete": null,
                "*": {
                  "@2": "&6.elements"
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "message": {
        "*": "&1.&",
        "decisions": "&1.payload.decisions",
        "elements": "&1.payload.elements"
      }
    }
  }
]

Current output:

{
  "message": {
    "header": {
      "something": "something"
    },
    "payload": {
      "decisions": [
        {
          "sequenceId": "1",
          "decision": "service1",
          "something": "something"
        },
        {
          "sequenceId": "2",
          "decision": "service2",
          "something": "something"
        }
      ],
      "elements": [
        {
          "serviceName": "service1",
          "something": "something"
        },
        {
          "serviceName": "service2",
          "something": "something"
        }
      ]
    },
    "workflow": {
      "Same String[1].ServiceId": "service1",
      "Same String[1].StatusCode": "R0401",
      "Same String[1].Decision.sequenceId": "1",
      "Same String[2].ServiceId": "service2",
      "Same String[2].StatusCode": "R0401",
      "Same String[2].Decision.sequenceId": "2",
      "Same String[3].ServiceId": "serviceToDelete",
      "Same String[3].StatusCode": "R0401",
      "Same String[3].Decision.sequenceId": "3"
    }
  },
  "feedbacks": [],
  "status": []
}

Any help would be appreciated. Thanks! :)

1 Answers

The trick is to partition by Same String[x] by adding

.&(2,1).

with the expression belonging to workflow object

"w*": {
  "*\\.*": {
    "serviceToDelete": null,
    "*": {
      "@1": "&3.&(2,1).&2"
    }
  }
}

in such a way that

[
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "message": {
        "*": "&1.&",
        "payload": {
          "*": "&",
          "d*": {
            "*": {
              "decision": {
                "serviceToDelete": null,
                "*": {
                  "@2": "&5.&4"
                }
              }
            }
          },
          "e*": {
            "*": {
              "serviceName": {
                "serviceToDelete": null,
                "*": {
                  "@2": "&5.&4"
                }
              }
            }
          }
        },
        "w*": {
          "*\\.*": {
            "serviceToDelete": null,
            "*": {
              "@1": "&3.&(2,1).&2"
            }
          }
        }
      }
    }
  },
  {
    // select only workflows ending with "ServiceId"   
    "operation": "shift",
    "spec": {
      "*": "&",
      "w*": {
        "*": {
          "*ServiceId": {
            "@1": "&3"
          }
        }
      }
    }
  },
  {
    // flatten "workflow" array to make it a common objects for all sub-attributes
    "operation": "shift",
    "spec": {
      "*": "&",
      "w*": {
        "*": {
          "*": {
            "@": "&3.&"
          }
        }
      }
    }
  }
]
Related