Home > Software design >  JOLT Transformation split objects from JSON with common values
JOLT Transformation split objects from JSON with common values

Time:11-18

I have an array of objects and I want to split each key from the object into a separate array in JSON.

Input JSON:

[
  {
    "Company": "Tesla",
    "Age": 30.2
  },
  {
    "Company": "Facebook",
    "Age": 40.5
  },
  {
    "Company": "Amazon",
    "Age": 60
  }
]

Expected Output

[
  {
    "value": "Tesla",
    "variable": "Company",
    "model": "device"
  },
  {
    "value": "Facebook",
    "variable": "Company",
    "model": "device"
  },
  {
    "value": "Amazon",
    "variable": "Company",
    "model": "device"
  },
  {
    "value": 30.2,
    "variable": "Age",
    "model": "device"
  },
  {
    "value": 40.5,
    "variable": "Age",
    "model": "device"
  },
  {
    "value": 60,
    "variable": "Age",
    "model": "device"
  }
]

Here the value of the Model is fixed. I have tried with some jolt spec. It's not working. Any help would be much appreciated!

CodePudding user response:

You can use shift transformation spec such as

[
  {
    // distinguish the attributes by indexes
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "@": "&1[&2].value", // @ represents values of the keys inherited from one upper level, &1 represents keys "Company" or "Age", [&2] represents going tree two levels up to grab the outermost indexes in an array fashion
          "$": "&1[&2].variable", // $ represents values of the keys inherited from one upper level
          "#device": "&1[&2].model"
        }
      }
    }
  },
  {
    // get rid of object/array labels
    "operation": "shift",
    "spec": {
      "*": {
        "*": ""
      }
    }
  }
]

the demo on the site enter image description here

Edit : If the input was

[
  {
    "Company": "Tesla",
    "Age": 30.2,
    "Time": "27/10/1992"
  },
  {
    "Company": "Facebook",
    "Age": 40.5,
    "Time": "27/10/1982"
  }
]

as mentioned in the comment, then you could convert the spec to

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "Company|Age": {
          "@": "&1[&2].value",
          "$": "&1[&2].variable",
          "@(1,Time)": "&1[&2].DateofBirth",
          "#device": "&1[&2].model"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": ""
      }
    }
  }
]

in order to get the following desired output :

[
  {
    "value": "Tesla",
    "variable": "Company",
    "DateofBirth": "27/10/1992",
    "model": "device"
  },
  {
    "value": "Facebook",
    "variable": "Company",
    "DateofBirth": "27/10/1982",
    "model": "device"
  },
  {
    "value": 30.2,
    "variable": "Age",
    "DateofBirth": "27/10/1992",
    "model": "device"
  },
  {
    "value": 40.5,
    "variable": "Age",
    "DateofBirth": "27/10/1982",
    "model": "device"
  }
]
  • Related