skip to Main Content

I have the following JSON :

{
  "Content": [
    {
      "CandidateFirstName": "Nagu",
      "Applications": {
        "ApplicationId": "456",
        "Sarasa": "test"
      }
    },
    {
      "CandidateFirstName": "Deleted",
      "Applications": {
        "ApplicationId": "123",
        "Sarasa": "test2"
      }
    }
  ]
}

and I’d like to have the following output:

[
  {
    "FirstName": "Nagu",
    "ApplicationsId": "456",
    "Sarasa": "test"
  },
  {
    "FirstName": "Deleted",
    "ApplicationsId": "123",
    "Sarasa": "test2"
  }
]

I’m close with the following jolt, but I’m not being able to remove the object "Applications":

[
  {
    "operation": "shift",
    "spec": {
      "Content": {
        "*": {
          "CandidateFirstName": "[&1].FirstName",
          "Applications": "[&1].Applications"
        }
      }
    }
  }
]

Do you know how to achieve this?

Thanks in advance!

3

Answers


  1. You can use two consecutive shift transformation specs

    [
      {//get individual objects nested within square brackets
        "operation": "shift",
        "spec": {
          "Content": {
            "*": {
              "Applications": {
                "@1,CandidateFirstName": "&2[#1].FirstName",
                "*": "&2[#2].&"
              }
            }
          }
        }
      },
      {// get rid of the keys of index values
        "operation": "shift",
        "spec": {
          "*": {
            "*": ""
          }
        }
      }
    ]
    

    or use a single spec such as

    [
      {
        "operation": "shift",
        "spec": {
          "Content": {
            "*": {
              "Candidate*": "[#2].FirstName",// the expression "&(0,1)" replicates the literal extracted from the current( 0th ) level of the 1st asterisk(might be multiple) which is stated on the LHS 
              "@Applications.ApplicationId": "[#2].ApplicationId",
              "@Applications.Sarasa": "[#2].Sarasa"
            }
          }
        }
      }
    ]
    

    where [#2], as having a # wildcard and nested within square brackets and staying on the right-hand-side, represents traversing one colon(:), and one opening curly brace { those makes 2 in order to reach the level of the indexes of the Content array to grab them.

    Yet, there’s another method as follows :

    [
      {
        "operation": "shift",
        "spec": {
          "Content": {
            "*": {
              "Appl*": {// represents the key of the node starts with "Appl" in order to shorten the literal "Applications"
                "@1,CandidateFirstName": "[&2].FirstName",// need to go one level up to get the value of the "CandidateFirstName" attribute
                "*": "[&2].&"
              }
            }
          }
        }
      }
    ]
    

    where [&2] on the RHS represents traversing two opening curly braces in contrast to the [#2]

    Login or Signup to reply.
  2. You can use this short and concise spec:

    [
      {
        "operation": "shift",
        "spec": {
          "*": {
            "*": {
              "Candidate*": "[&1].&(0,1)",
              "*": {
                "*": "[&2].&"
              }
            }
          }
        }
      }
    ]
    
    Login or Signup to reply.
  3. Yes, you were quite close. You have to just add one more level of nested section for Applications section

    [
     {
     "operation": "shift",
     "spec": {
      "Content": {
        "*": {
          "CandidateFirstName": "[&1].FirstName",
          "Applications": {
             "*": "[&2].&"
          }
        }
       }
      }
     }
    ]
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search