Chethan
Chethan

Reputation: 73

Jolt Conversion - iterate list within a list and form single list

I am trying to iterate lists inside a list and form a single list with multiple objects. Iterating lists, I am able to achieve. But applying tags before the list iterating to each object is not happening if there are more objects in single list.

My input request is like below:

[
  {
    "success": [
      {
        "id": "4",
        "Offers": [
          {
            "name": "Optional",
            "type": {
              "id": "1",
              "name": "Optional"
            },
            "productOfferings": [
              {
                "id": "3",
                "name": "Test1"
              }
            ]
          },
          {
            "name": "Default",
            "type": {
              "id": "2",
              "name": "Default"
            },
            "productOfferings": [
              {
                "id": "1",
                "name": "Test2"
              },
              {
                "id": "2",
                "name": "Test3"
              }
            ]
          }
        ]
      }
    ]
  }
]

My spec is like below:


[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "success": {
          "*": {
            "Offers": {
              "*": {
                "name": "[&1].[&3].typeName",
                "type": {
                  "id": "[&2].[&4].typeNameId",
                  "name": "[&2].[&4].typeNameValue"
                },
                "productOfferings": {
                  "*": {
                    "id": "[&3].[&1].id",
                    "name": "[&3].[&1].name"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[]"
      }
  }
    }
]

Output Received from spec:

[
  {
    "typeName": "Optional",
    "typeNameId": "1",
    "typeNameValue": "Optional",
    "id": "3",
    "name": "Test1"
  },
  {
    "typeName": "Default",
    "typeNameId": "2",
    "typeNameValue": "Default",
    "id": "1",
    "name": "Test2"
  },
  {
    "id": "2",
    "name": "Test3"
  }
]

But Expected output is like below:

[
  {
    "typeName": "Optional",
    "typeNameId": "1",
    "typeNameValue": "Optional",
    "id": "3",
    "name": "Test1"
  },
  {
    "typeName": "Default",
    "typeNameId": "2",
    "typeNameValue": "Default",
    "id": "1",
    "name": "Test2"
  },
  {
    "typeName": "Default",
    "typeNameId": "2",
    "typeNameValue": "Default",
    "id": "2",
    "name": "Test3"
  }
]

If there are more objects inside productOfferings object, I am not able to add typeName,typeNameId, typeNameValue to the actual object. Please help to fix this issue.

Upvotes: 1

Views: 299

Answers (1)

Barbaros Özhan
Barbaros Özhan

Reputation: 65408

You seem just needing to collect all into the productOfferings array while prepending each key by the common identifier [&3].[&1] such as

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "success": {
          "*": {
            "Offers": {
              "*": {
                "productOfferings": {
                  "*": {
                    "@(2,name)": "[&3].[&1].typeName",
                    "@(2,type.id)": "[&3].[&1].typeNameId",
                    "@(2,type.name)": "[&3].[&1].typeNameValue",
                    "*": "[&3].[&1].&"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[]"
      }
    }
  }
]

Upvotes: 1

Related Questions