JOLT transformation for carrying parent fields to child

Viewed 31

I trying to apply JOLT transformation to convert one JSON structure into another. The JOLT spec I came up with does not distribute parent fields to child as I want and is explained in the example below. Could you please help with the mistake I'm doing in the spec?

My input JSON

{
  "numberOfBlocks": 2,
  "signatoryBlocks": [
    {
      "block": [
        {
          "role": "abcd"
        },
        {
          "order": "1"
        },
        {
          "signatureProviderName": "universalsignaturepen_opentrust_hash_tsp"
        },
        {
          "signatories": [
            {
              "email": "joe.smith@abcd.com",
              "name": "Joe Smith",
              "initials": "JS",
              "capacity": "Authorised Signatory",
              "company": "abcd AG",
              "oneTimePassword": "test_joe",
              "sms": "1234"
            },
            {
              "email": "jane.doe@abcd.com",
              "name": "Jane Doe",
              "initials": "JD",
              "capacity": "Director",
              "company": "abcd AG",
              "oneTimePassword": "test_jane",
              "sms": "4567"
            }
          ]
        }
      ]
    },
    {
      "block": [
        {
          "role": "Signer 2"
        },
        {
          "order": "1"
        },
        {
          "signatureProviderName": "universalsignaturepen_opentrust_hash_tsp"
        },
        {
          "signatories": [
            {
              "email": "rachel.smith@abcd.com",
              "name": "Rachel Smith",
              "initials": "RS",
              "capacity": "Authorised Signatory",
              "company": "abcd AG",
              "oneTimePassword": "test_rachel",
              "sms": ""
            },
            {
              "email": "joe.bloggs@abcd.com",
              "name": "Joe Bloggs",
              "initials": "JB",
              "capacity": "Authorised Signatory",
              "company": "abcd AG",
              "oneTimePassword": "test_joe",
              "sms": "111"
            }
          ]
        }
      ]
    }
  ]
}

My JOLT spec

[
  {
    "operation": "shift",
    "spec": {
      "#3186": "entityId",
      "#160": "entityTypeId",
      "#1007": "clientId",
      "*": ["rawData.&0", "formatedData.&0"]
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&0",
      "formatedData": {
        "signatoryBlocks": {
          "*": {
            "block": {
              "3": {
                "signatories": {
                  "*": {
                    "@3": {
                      "0": {
                        "role": "formatedData.[#8].roleGroupName"
                      },
                      "1": {
                        "order": "formatedData.[#8].order"
                      },
                      "2": {
                        "signatureProviderName": "formatedData.[#8].signatureProviderName"
                      }
                    },
                    "*": "formatedData.[#6].userDetails[#2].&0"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "formatedData": {
        "*": {
          "roleGroupName": "ONE",
          "order": "ONE",
          "signatureProviderName": "ONE"
        }
      }
    }
  }
  ]

Output I am getting using my JOLT spec

{
  "entityId": "3186",
  "entityTypeId": "160",
  "clientId": "1007",
  "rawData": {
    "numberOfBlocks": 2,
    "signatoryBlocks": [
      {
        "block": [
          {
            "role": "abcd"
          },
          {
            "order": "1"
          },
          {
            "signatureProviderName": "universalsignaturepen_opentrust_hash_tsp"
          },
          {
            "signatories": [
              {
                "email": "joe.smith@abcd.com",
                "name": "Joe Smith",
                "initials": "JS",
                "capacity": "Authorised Signatory",
                "company": "abcd AG",
                "oneTimePassword": "test_joe",
                "sms": "1234"
              },
              {
                "email": "jane.doe@abcd.com",
                "name": "Jane Doe",
                "initials": "JD",
                "capacity": "Director",
                "company": "abcd AG",
                "oneTimePassword": "test_jane",
                "sms": "4567"
              }
            ]
          }
        ]
      },
      {
        "block": [
          {
            "role": "Signer 2"
          },
          {
            "order": "1"
          },
          {
            "signatureProviderName": "universalsignaturepen_opentrust_hash_tsp"
          },
          {
            "signatories": [
              {
                "email": "rachel.smith@abcd.com",
                "name": "Rachel Smith",
                "initials": "RS",
                "capacity": "Authorised Signatory",
                "company": "abcd AG",
                "oneTimePassword": "test_rachel",
                "sms": ""
              },
              {
                "email": "joe.bloggs@abcd.com",
                "name": "Joe Bloggs",
                "initials": "JB",
                "capacity": "Authorised Signatory",
                "company": "abcd AG",
                "oneTimePassword": "test_joe",
                "sms": "111"
              }
            ]
          }
        ]
      }
    ]
  },
  "formatedData": [
    {
      "roleGroupName": "abcd",
      "order": "1",
      "signatureProviderName": "universalsignaturepen_opentrust_hash_tsp",
      "userDetails": [
        {
          "email": "joe.smith@abcd.com",
          "name": "Joe Smith",
          "initials": "JS",
          "capacity": "Authorised Signatory",
          "company": "abcd AG",
          "oneTimePassword": "test_joe",
          "sms": "1234"
        },
        {
          "email": "jane.doe@abcd.com",
          "name": "Jane Doe",
          "initials": "JD",
          "capacity": "Director",
          "company": "abcd AG",
          "oneTimePassword": "test_jane",
          "sms": "4567"
        }
      ]
    },
    {
      "roleGroupName": "Signer 2",
      "order": "1",
      "signatureProviderName": "universalsignaturepen_opentrust_hash_tsp",
      "userDetails": [
        {
          "email": "rachel.smith@abcd.com",
          "name": "Rachel Smith",
          "initials": "RS",
          "capacity": "Authorised Signatory",
          "company": "abcd AG",
          "oneTimePassword": "test_rachel",
          "sms": ""
        },
        {
          "email": "joe.bloggs@abcd.com",
          "name": "Joe Bloggs",
          "initials": "JB",
          "capacity": "Authorised Signatory",
          "company": "abcd AG",
          "oneTimePassword": "test_joe",
          "sms": "111"
        }
      ]
    }
  ]
}

Output I want

{
  "entityId": 3186,
  "entityTypeId": 160,
  "clientId": 1007,
  "rawData": "complete_body_of_input_JSON_here",
  "formatedData": [
    {
      "roleGroupName": "abcd",
      "order": "1",
      "signatureProvider": "universalsignaturepen_opentrust_hash_tsp",
      "userDetails": [
        {
          "email": "joe.smith@abcd.com",
          "name": "Joe Smith",
          "initials": "JS",
          "capacity": "Authorised Signatory",
          "company": "abcd AG",
          "oneTimePassword": "test_joe",
          "sms": "1234"
        }
      ]
    },
    {
      "roleGroupName": "abcd",
      "order": "1",
      "signatureProvider": "universalsignaturepen_opentrust_hash_tsp",
      "userDetails": [
        {
          "email": "jane.doe@abcd.com",
          "name": "Jane Doe",
          "initials": "JD",
          "capacity": "Director",
          "company": "abcd AG",
          "oneTimePassword": "test_jane",
          "sms": "4567"
        }
      ]
    },
    {
      "roleGroupName": "Signer 2",
      "order": "1",
      "signatureProvider": "universalsignaturepen_opentrust_hash_tsp",
      "userDetails": [
        {
          "email": "rachel.smith@abcd.com",
          "name": "Rachel Smith",
          "initials": "RS",
          "capacity": "Authorised Signatory",
          "company": "abcd AG",
          "oneTimePassword": "test_rachel",
          "sms": ""
        }
      ]
    },
    {
      "roleGroupName": "Signer 2",
      "order": "1",
      "signatureProvider": "universalsignaturepen_opentrust_hash_tsp",
      "userDetails": [
        {
          "email": "joe.bloggs@abcd.com",
          "name": "Joe Bloggs",
          "initials": "JB",
          "capacity": "Authorised Signatory",
          "company": "abcd AG",
          "oneTimePassword": "test_joe",
          "sms": "111"
        }
      ]
    }
  ]
}

What am I doing wrong?

1 Answers

Here is the answer

[
  {
    "operation": "shift",
    "spec": {
      "#3186": "entityId",
      "#160": "entityTypeId",
      "#1007": "clientId",
      "*": ["rawData.&0","formatedData.&0"]
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&0",
      "formatedData": {
        "signatoryBlocks": {
          "*": {
            "block": {
              "3": {
                "signatories": {
                  "*": {
                    "@3": {
                      "0": {
                        "role": "formatedData.[#8].[#6].[#4].roleGroupName"
                      },
                      "1": {
                        "order": "formatedData.[#8].[#6].[#4].order"
                      },
                      "2": {
                        "signatureProviderName": "formatedData.[#8].[#6].[#4].signatureProviderName"
                      }
                    },
                    "*": "formatedData.[#6].[#4].[#2].userDetails.&0"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "entityId": "=toInteger",
      "entityTypeId": "=toInteger",
      "clientId": "=toInteger"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&0",
      "formatedData": {
        "*": {
          "*": {
            "*": "formatedData"
          }
        }
      }
    }
  }
]
Related