Home > Software design >  JOLT filter - remove fields from nested array based on condition
JOLT filter - remove fields from nested array based on condition

Time:01-21

Hello guys, I have to make an JOLT filter to delete a field based on condition, also the filter has to work with two different JSON structures.

So, here is the case.

I have these JSON's:

JSON 1:

{
  "header": {
    "key": "value"
  },
  "payload": {
    "someArray": [
      {
        "key1": "val1"
      }
    ],
    "elements": [
      {
        "service": "serviceOne",
        "something": "somethingValue"
      },
      {
        "service": "THIS_SERVICE",
        "attributes": [
          {
            "something": "somethingValue",
            "attributes_here": {
              "key1": "val1",
              "key2": "val2",
              "key3": "val3",
              "key4": "val4",
              "key5": "val5",
              "key6": "val6"
            }
          }
        ]
      }
    ]
  },
  "data": {
    "key1": "val1"
  }
}

JSON 2:

{
  "responseMessage": {
    "header": {
      "key": "value"
    },
    "payload": {
      "someArray": [
        {
          "key1": "val1"
        }
      ],
      "elements": [
        {
          "service": "serviceOne",
          "something": "somethingValue"
        },
        {
          "service": "THIS_SERVICE",
          "attributes": [
            {
              "something": "somethingValue",
              "attributes_here": {
                "key1": "val1",
                "key2": "val2",
                "key3": "val3",
                "key4": "val4",
                "key5": "val5",
                "key6": "val6"
              }
            }
          ]
        }
      ]
    },
    "data": {
      "key1": "val1"
    },
    "state": {
      "state1": "state1"
    }
  },
  "status": [],
  "notes": []
}

I need the filter to remove for example "key2" and "key5" from the "attributes_here" only if the "service" value is "THIS_SERVICE" and keep the same structure for the JSON.

Desired output:

JSON 1:

{
  "header": {
    "key": "value"
  },
  "payload": {
    "someArray": [
      {
        "key1": "val1"
      }
    ],
    "elements": [
      {
        "service": "serviceOne",
        "something": "somethingValue"
      },
      {
        "service": "THIS_SERVICE",
        "attributes": [
          {
            "something": "somethingValue",
            "attributes_here": {
              "key1": "val1",
              "key3": "val3",
              "key4": "val4",
              "key6": "val6"
            }
          }
        ]
      }
    ]
  },
  "data": {
    "key1": "val1"
  }
}

JSON 2:

{
  "responseMessage": {
    "header": {
      "key": "value"
    },
    "payload": {
      "someArray": [
        {
          "key1": "val1"
        }
      ],
      "elements": [
        {
          "service": "serviceOne",
          "something": "somethingValue"
        },
        {
          "service": "THIS_SERVICE",
          "attributes": [
            {
              "something": "somethingValue",
              "attributes_here": {
                "key1": "val1",
                "key3": "val3",
                "key4": "val4",
                "key6": "val6"
              }
            }
          ]
        }
      ]
    },
    "data": {
      "key1": "val1"
    },
    "state": {
      "state1": "state1"
    }
  },
  "status": [],
  "notes": []
}

Any help would be appreciated. Thank you and wish you a great day!

CodePudding user response:

Please try the below jolt spec:

[
  {
    "operation": "shift",
    "spec": {
      "#false": "has_responseMessage",
      "header": "&",
      "payload": "&",
      "data": "&",
      "responseMessage": {
        "*": "&",
        "@(2,status)": "rest_&.status",
        "@(2,notes)": "rest_&.notes",
        "#true": "has_responseMessage"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "payload": {
        "*": "&1.&",
        "elements": {
          "*": { // 0, 1
            "*": "&3.&2[&1].&",
            "service": {
              "@": "&4.&3[&2].&1",
              "THIS_SERVICE": {
                "@(2,attributes)": "&5.&4[&3].attributes_temp",
                "#attributes_temp": "&5.&4[&3].attributes_key"
              },
              "#attributes": "&4.&3[&2].attributes_key"
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "has_responseMessage": "=lastElement",
      "payload": {
        "elements": {
          "*": {
            "attributes_key": "=lastElement"
          }
        }
      }
    }
  },
  {
    "operation": "remove",
    "spec": {
      "payload": {
        "elements": {
          "*": {
            "attributes_temp": {
              "*": {
                "attributes_here": {
                  "key2": "",
                  "key5": ""
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "payload": {
        "*": "&1.&",
        "elements": {
          "*": { // 0, 1
            "service": "&3.&2[&1].&",
            "something": "&3.&2[&1].&",
            "attributes_key": {
              "attributes_temp": {
                "@(2,attributes_temp)": "&5.&4[&3].attributes"
              },
              "attributes": {
                "@(2,attributes)": "&5.&4[&3].attributes"
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "has_responseMessage": {
        "true": {
          "@(3,header)": "responseMessage.header",
          "@(3,payload)": "responseMessage.payload",
          "@(3,data)": "responseMessage.data",
          "@(3,state)": "responseMessage.state"
        },
        "false": {
          "@(3,header)": "header",
          "@(3,payload)": "payload",
          "@(3,data)": "data"
        }
      },
      "rest_responseMessage": {
        "*": "&"
      }
    }
  }
]

You can remove your fields in the remove operation as you want.

CodePudding user response:

You can use the following spec as an option :

[
  {
    "operation": "shift",
    "spec": {
      "responseMessage": { // distinguish the elements whether they have an extra wrapper 
        "*": "&1_&"
      },
      "*": "&"
    }
  },
  { // accumulate the respective attributes by their "service" value within the "attributes_here" object
    "operation": "shift",
    "spec": {
      "*": "&",
      "*ayload": {
        "*": "&1.&",
        "elements": {
          "*": {
            "*": "&3.&2[#2].&",
            "attributes": {
              "*": {
                "*": "&5.&4[#4].&2[#2].&",
                "attributes_here": {
                  "*": "&6.&5[#5].&3[#3].&1.&",
                  "key2|key5": "&6.&5[#5].&3[#3].&1.@4,service.&"
                }
              }
            }
          }
        }
      }
    }
  },
  {// get rid of the keys with "THIS_SERVICE"
    "operation": "remove",
    "spec": {
      "*ayload": {
        "elements": {
          "*": {
            "attributes": {
              "*": {
                "attributes_here": {
                  "THIS_SERVICE": ""
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "responseMessage_*": {
        "*": "&(1,1).&"
      },
      "*": "&"
    }
  }
]
  • Related