Search code examples
jsonjoltjsonparser

How to correct this jolt transformation


I have an input JSON like this.

{
  "trackingNumber": "1ZEA83550362028861",
  "localActivityDate": "20210324",
  "localActivityTime": "183500",
  "scheduledDeliveryDate": "20220525",
  "actualDeliveryDate": "20220729",
  "actualdeliveryTime": "183500",
  "gmtActivityDate": "20210324",
  "gmtActivityTime": "223500",
  "activityStatus": {
    "type": "G",
    "code": "OR",
    "description": "Origin Scan"
  },
  "activityLocation": {
    "city": "RANDALLSTOWN,",
    "stateProvince": "MD",
    "postalCode": "21133",
    "country": "US"
  }
}

I have written a jolt transformation for this JSON

[
  {
    "operation": "shift",
    "spec": {
      "trackingNumber": "transformedPayload.trackingInfo",
      "localActivityDate": "tmp_Date",
      "localActivityTime": "tmp_Time",
      "scheduledDeliveryDate": "tmp_App",
      "actualDeliveryDate": "tmp_Del_Date",
      "actualdeliveryTime": "tmp_Del_Time",
      "activityStatus": {
        "type": "transformedPayload.events.type",
        "code": "transformedPayload.events.statusCode",
        "description": "transformedPayload.events.statusDescription"
      },
      "activityLocation": {
        "city": "transformedPayload.address.city",
        "stateProvince": "transformedPayload.address.state",
        "postalCode": "transformedPayload.address.postalCode",
        "country": "transformedPayload.address.country"
      }
    }
  },
  {
    "operation": "modify-default-beta",
    "spec": {
      "tmp_Year": "=substring(@(1,tmp_Date),0,4)",
      "tmp_Month": "=substring(@(1,tmp_Date),4,6)",
      "tmp_Day": "=substring(@(1,tmp_Date),6,8)",
      "tmp_Hours": "=substring(@(1,tmp_Time),0,2)",
      "tmp_Minutes": "=substring(@(1,tmp_Time),2,4)",
      "tmp_Seconds": "=substring(@(1,tmp_Time),4,6)",
      "timeStamp": "=concat(@(1,tmp_Year),'-',@(1,tmp_Month),'-',@(1,tmp_Day),'T',@(1,tmp_Hours),':',@(1,tmp_Minutes),':',@(1,tmp_Seconds),'Z')",
      "tmp_App_Year": "=substring(@(1,tmp_App),0,4)",
      "tmp_App_Month": "=substring(@(1,tmp_App),4,6)",
      "tmp_App_Day": "=substring(@(1,tmp_App),6,8)",
      "appointmentTime": "=concat(@(1,tmp_App_Year),'-',@(1,tmp_App_Month),'-',@(1,tmp_App_Day))",
      "tmp__Del_Year": "=substring(@(1,tmp_Del_Date),0,4)",
      "tmp_Del_Month": "=substring(@(1,tmp_Del_Date),4,6)",
      "tmp_Del_Day": "=substring(@(1,tmp_Del_Date),6,8)",
      "tmp_Del_Hours": "=substring(@(1,tmp_Del_Time),0,2)",
      "tmp_Del_Minutes": "=substring(@(1,tmp_Del_Time),2,4)",
      "tmp_Del_Seconds": "=substring(@(1,tmp_Del_Time),4,6)",
      "deliveryTime": "=concat(@(1,tmp__Del_Year),'-',@(1,tmp_Del_Month),'-',@(1,tmp_Del_Day),'T',@(1,tmp_Del_Hours),':',@(1,tmp_Del_Minutes),':',@(1,tmp_Del_Seconds),'Z')"
    }
  },
  {
    "operation": "remove",
    "spec": {
      "tmp_*": ""
    }
  }
]

This transforms the data into this format.

{
  "transformedPayload" : {
    "trackingInfo" : "1ZEA83550362028861",
    "events" : {
      "type" : "G",
      "statusCode" : "OR",
      "statusDescription" : "Origin Scan"
    },
    "address" : {
      "city" : "RANDALLSTOWN,",
      "state" : "MD",
      "postalCode" : "21133",
      "country" : "US"
    }
  },
  "timeStamp" : "2021-03-24T18:35:00Z",
  "appointmentTime" : "2022-05-25",
  "deliveryTime" : "2022-07-29T18:35:00Z"
}

What changes do i need to make in the transformation such that the timestamp, appointmentTime and deliveryTime are also nested under transformedPayload i.e it looks like this (correct format).

{
  "transformedPayload" : {
    "trackingInfo" : "1ZEA83550362028861",
    "events" : {
      "type" : "G",
      "statusCode" : "OR",
      "statusDescription" : "Origin Scan"
    },
    "address" : {
      "city" : "RANDALLSTOWN,",
      "state" : "MD",
      "postalCode" : "21133",
      "country" : "US"
    },
    "timeStamp" : "2021-03-24T18:35:00Z",
    "appointmentTime" : "2022-05-25",
    "deliveryTime" : "2022-07-29T18:35:00Z"
  }
}

This is my first time doing a jolt transformation so i am confused on how to resolve this. Any help is appreciated.


Solution

  • You are already so close to solution,I can offer the following spec similar to yours to the desired output :

    [
      {
        "operation": "modify-overwrite-beta",
        "spec": {
          "tsY": "=substring(@(1,localActivityDate),0,4)",
          "tsM": "=substring(@(1,localActivityDate),4,6)",
          "tsD": "=substring(@(1,localActivityDate),6,8)",
          "tsH": "=substring(@(1,localActivityTime),0,2)",
          "tsMi": "=substring(@(1,localActivityTime),2,4)",
          "tsS": "=substring(@(1,localActivityTime),4,6)",
          "timeStamp": "=concat(@(1,tsY),'-',@(1,tsM),'-',@(1,tsD),'T',@(1,tsH),':',@(1,tsMi),':',@(1,tsS),'Z')",
          "aTY": "=substring(@(1,scheduledDeliveryDate),0,4)",
          "aTM": "=substring(@(1,scheduledDeliveryDate),4,6)",
          "aTD": "=substring(@(1,scheduledDeliveryDate),6,8)",
          "appointmentTime": "=concat(@(1,aTY),'-',@(1,aTM),'-',@(1,aTD))",
          "dTY": "=substring(@(1,actualDeliveryDate),0,4)",
          "dTM": "=substring(@(1,actualDeliveryDate),4,6)",
          "dTD": "=substring(@(1,actualDeliveryDate),6,8)",
          "dTH": "=substring(@(1,actualdeliveryTime),0,2)",
          "dTMi": "=substring(@(1,actualdeliveryTime),2,4)",
          "dTS": "=substring(@(1,actualdeliveryTime),4,6)",
          "deliveryTime": "=concat(@(1,dTY),'-',@(1,dTM),'-',@(1,dTD),'T',@(1,dTH),':',@(1,dTMi),':',@(1,dTS),'Z')"
        }
      },
      {
        "operation": "shift",
        "spec": {
          "*Number": "&(0,1)Info",
          "activityStatus": {
            "*": "events.&"
          },
          "activityLocation": {
            "*": "address.&"
          },
          "timeStamp": "&",
          "appointmentTime": "&",
          "deliveryTime": "&"
        }
      }
    ]