skip to Main Content

I have to make a 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 JSONs:

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 I wish you a great day!

2

Answers


  1. 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.

    Login or Signup to reply.
  2. 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": {
          "*_*": {
            "@": "&(1,1).&(1,2)" // the value of the first and second asterisks, after going one level up the tree, respectively
          },
          "*": "&"
        }
      }
    ]
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search