Home > Software engineering >  JOLT: Combine JSON array using common key
JOLT: Combine JSON array using common key

Time:11-06

My JSON looks something like this, its an array of workers and an array of worksites. The workers start with a worksite id so I need to merge them with the worksites (inside an array).

[
  {
    "worksite_candidates": {
      "worksite_id": "12345",
      "worker": {
        "id": "1232",
        "managerId": "09"
      },
      "openDate": "2022-10-14",
      "finalDate": "2022-12-16"
    }
  },
  {
    "worksite_candidates": {
      "worksite_id": "12345",
      "worker": {
        "id": "1233",
        "managerId": "08"
      },
      "openDate": "",
      "finalDate": ""
    }
  },
  {
    "worksite_candidates": {
      "worksite_id": "12347",
      "worker": {
        "id": "1234",
        "managerId": "09"
      },
      "openDate": "2022-11-10",
      "finalDate": "2022-11-12"
    }
  },
  {
    "worksite": {
      "id": "12345",
      "status": "2",
      "dayid": "2",
      "vacancys": "1",
      "countryid": "2",
      "arenaid": "8"
    }
  },
  {
    "worksite": {
      "id": "12347",
      "status": "2",
      "dayid": "2",
      "vacancys": "1",
      "countryid": "2",
      "arenaid": "8"
    }
  }
]

and I need to transform it using a JOLT to something like this, workers go inside the worksite as an array

[
  {
    "worksite": {
      "id": "12345",
      "status": "2",
      "dayid": "2",
      "vacancys": "1",
      "countryid": "2",
      "arenaid": "8",
      "Candidates": [
        {
          "worker": {
            "id": "1232",
            "managerId": "09"
          },
          "openDate": "2022-10-14",
          "finalDate": "2022-12-16"
        },
        {
          "worker": {
            "id": "1233",
            "managerId": "08"
          },
          "openDate": "",
          "finalDate": ""
        }
      ]
    }
  },
  {
    "worksite": {
      "id": "12347",
      "status": "2",
      "dayid": "2",
      "vacancys": "1",
      "countryid": "2",
      "arenaid": "8",
      "Candidates": [
        {
          "worker": {
            "id": "1234",
            "managerId": "09"
          },
          "openDate": "2022-11-10",
          "finalDate": "2022-11-12"
        }
      ]
    }
  }
]

Please suggest a JOLT to get the desired output. Can't find a way to do it

CodePudding user response:

I think this solution is correct

[
  {
    //group element for id and worksite_id
    "operation": "shift",
    "spec": {
      "*": {
        "worksite": {
          "id": "data.@(1,id).&",
          "status": "data.@(1,id).&",
          "dayid": "data.@(1,id).&",
          "vacancys": "data.@(1,id).&",
          "countryid": "data.@(1,id).&",
          "arenaid": "data.@(1,id).&"
        },
        "worksite_candidates": {
          "worksite_id": {
            "*": {
              "@2": "data.&.Candidates"
            }
          }
        }
      }
    }
  },
  //create output with array
  {
    "operation": "shift",
    "spec": {
      "data": {
        "*": "[]"
      }
    }
  },
  //remove field worksite_id
  {
    "operation": "remove",
    "spec": {
      "*": {
        "Candidates": {
          "*": {
            "worksite_id": ""
          }
        }
      }
    }
  }
]

CodePudding user response:

You can walk within worksite_candidates and worksite objects

while grouping the elements by worksite id values

(values of the worksite_candidates.worksite_id and worksite.id attributes) such as

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "worksite_c*": {
          "*": "@(1,worksite_id).worksite.Candidates[&2].&" // [&2] is for going two levels up to reach the top level indexes and grabbing them to generate array results 
        },
        "worksite": {
          "*": "@(1,id).&1.&"
        }
      }
    }
  },
  {
   // get rid of redundant "worksite_id" attribute
    "operation": "remove",
    "spec": {
      "*": {
        "*": {
          "*": {
            "*": {
              "worksite_id": ""
            }
          }
        }
      }
    }
  },
  {
   // get rid of null components
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": "=recursivelySquashNulls"
    }
  },
  {
   // get rid of topmost labels of objects
    "operation": "shift",
    "spec": {
      "*": ""
    }
  }
]

the demo on the site enter image description here

  • Related