Home > Net >  JSON Array Iteration - Tree Traversing in Mulesoft 4
JSON Array Iteration - Tree Traversing in Mulesoft 4

Time:12-27

Input JSON:

     {
        "id": "/",
        "code": "/",
        "typeCode": "CPC",
        "timeStamp": "2021-11-16T17:00:00-06:00",
        "childList": [
            {
                "id": "577-1-1",
                "code": "1111",
                "name": "Electronics-1-1",
                "displayName": "Electronics-1-1",
                "active": true,
                "languageCode": "en",
                "typeCode": "CPC",
                "childList": [
                    {
                        "id": "579-2-1",
                        "code": "2222",
                        "name": "Calculators-2-1",
                        "displayName": "Calculators-2-1",
                        "active": true,
                        "languageCode": "en",
                        "typeCode": "CPC",
                        "childList": []
                    },
                    {
                        "id": "509-2-2",
                        "code": "3333",
                        "name": "Oven-2-2",
                        "displayName": "Oven-2-2",
                        "active": true,
                        "languageCode": "en",
                        "typeCode": "CPC",
                        "childList": [
                            {
                                "id": "749-3-1",
                                "code": "4444",
                                "name": "MicroOven-3-1",
                                "displayName": "MicroOven-3-1",
                                "active": true,
                                "languageCode": "en",
                                "typeCode": "CPC",
                                "childList": []
                            }
                        ]
                    }
                ]
            },
            {
                "id": "549-1-2",
                "code": "5555",
                "name": "Toys, Crafts & Leisure",
                "displayName": "Toys, Crafts & Leisure",
                "active": true,
                "languageCode": "en",
                "typeCode": "CPC",
                "childList": [
                    {
                        "id": "49674",
                        "code": "7605",
                        "name": "Pet Supplies",
                        "displayName": "Pet Supplies",
                        "active": true,
                        "languageCode": "en",
                        "typeCode": "CPC",
                        "childList": [
                            {
                                "id": "49684",
                                "code": "7615",
                                "name": "Beds & Houses",
                                "displayName": "Beds & Houses",
                                "active": true,
                                "languageCode": "en",
                                "typeCode": "CPC",
                                "childList": []
                            }
                        ]
                    }
                ]
            },
            {
                "id": "58782",
                "code": "0100",
                "name": "Fashion (new)",
                "displayName": "Fashion",
                "active": true,
                "languageCode": "en",
                "typeCode": "CPC",
                "childList": [
                    {
                        "id": "49056",
                        "code": "6958",
                        "name": "Blazers & Jackets, Etc. - Department",
                        "displayName": "Blazers & Jackets, Etc.",
                        "active": true,
                        "languageCode": "en",
                        "typeCode": "CPC",
                        "childList": [
                            {
                                "id": "50851",
                                "code": "7837",
                                "name": "Dusters PDM Name",
                                "displayName": "Dusters PDM Display Name",
                                "active": true,
                                "languageCode": "en",
                                "typeCode": "CPC",
                                "childList": []
                            }
                        ]
                    }
                ]
            }
        ]
    }
  1. And the expected XML is as below - Here the categoryPath has to be noted for the complete address of childElement and has to be grouped under 1st parent childList
  2. We will not know the exact child elements of any array i.e., there can be ‘n’ number of childList inside a childList
  3. How many elements are present in 1st childlist array - those many CategoryList elements has to be formed in xml

Note: here I have just taken 2 elements as an example - but any childlist array can have any number of childlists array inside it.

XML Transformation:

<Category CategoryId="${childList.code}" CategoryPath="${childList.code}/${childList.childList.code}" Description="${childList.displayName}" ShortDescription="${childList.name}">
    <Extn ExtnSyncTS="${headers.timeStamp}"/>
</Category>

Expected XML:

<CategoryListArray>
<CategoryList>
    <Category CategoryId="1111" CategoryPath="1111" Description="Electronics-1-1" ShortDescription="Electronics-1-1">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
    <Category CategoryId="2222" CategoryPath="1111/2222" Description="Calculators-2-1" ShortDescription="Calculators-2-1">
        <Extn ExtnSyncTS=" "/>
    </Category>
    <Category CategoryId="3333" CategoryPath="1111/3333" Description="Oven-2-2" ShortDescription="Oven-2-2">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
    <Category CategoryId="4444" CategoryPath="1111/3333/4444" Description="MicroOven-3-1" ShortDescription="MicroOven-3-1">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
</CategoryList>
<CategoryList>
    <Category CategoryId="5555" CategoryPath="5555" Description="Toys, Crafts & Leisure" ShortDescription="Toys, Crafts & Leisure">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
    <Category CategoryId="7605" CategoryPath="5555/7605" Description="Pet Supplies" ShortDescription="Pet Supplies">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
    <Category CategoryId="7615" CategoryPath="5555/7605/7615" Description="Beds & Houses" ShortDescription="Beds & Houses">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
</CategoryList>
<CategoryList>
    <Category CategoryId="0100" CategoryPath="0100" Description="Fashion" ShortDescription="Fashion (new)">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
    <Category CategoryId="6958" CategoryPath="0100/6958" Description=""Blazers & Jackets, Etc." ShortDescription="Blazers & Jackets, Etc. - Department">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
    <Category CategoryId="7837" CategoryPath="0100/6958/7837" Description="Dusters PDM Display Name" ShortDescription="Dusters PDM Name">
        <Extn ExtnSyncTS="2021-11-16T17:00:00-06:00"/>
    </Category>
</CategoryList>
</CategoryListArray>

CodePudding user response:

I modified my previous answer to support the new output. I used a nested function to reuse the previous method untouched while adding for the changes at the top, so there is only one function visible to the script.

%dw 2.0
output application/xml

fun mapToCategoriesArrayList(data) = do {
    fun mapChildren(x, timestamp, path)=
        x match {
            case o is Object -> 
                ([{
                    Category @(CategoryId: o.id, CategoryPath: (if (isEmpty(path)) "" else path    "/")    o.code, Description: o.name, ShortDescription: o.displayName ): {Extn: timestamp}
                }] 
                   mapChildren(o.childList, timestamp, (if (isEmpty(path)) "" else path    "/")    o.code)) 
            
            case a is Array -> 
                (a flatMap mapChildren($, timestamp, path) )
                
            else -> $
        }
    ---
    {
        CategoryListArray: 
            ( 
                data.childList map { 
                    CategoryList:
                          mapChildren($, data.timeStamp, "") 
                          reduce ((item, accumulator={}) -> accumulator    item ) 
                }
            ) reduce ((item, accumulator={}) -> accumulator    item ) 
    }
}
---
mapToCategoriesArrayList(payload)

Output:

<?xml version='1.0' encoding='UTF-8'?>
<CategoryListArray>
  <CategoryList>
    <Category CategoryId="577-1-1" CategoryPath="1111" Description="Electronics-1-1" ShortDescription="Electronics-1-1">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
    <Category CategoryId="579-2-1" CategoryPath="1111/2222" Description="Calculators-2-1" ShortDescription="Calculators-2-1">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
    <Category CategoryId="509-2-2" CategoryPath="1111/3333" Description="Oven-2-2" ShortDescription="Oven-2-2">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
    <Category CategoryId="749-3-1" CategoryPath="1111/3333/4444" Description="MicroOven-3-1" ShortDescription="MicroOven-3-1">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
  </CategoryList>
  <CategoryList>
    <Category CategoryId="549-1-2" CategoryPath="5555" Description="Toys, Crafts &amp; Leisure" ShortDescription="Toys, Crafts &amp; Leisure">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
    <Category CategoryId="49674" CategoryPath="5555/7605" Description="Pet Supplies" ShortDescription="Pet Supplies">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
    <Category CategoryId="49684" CategoryPath="5555/7605/7615" Description="Beds &amp; Houses" ShortDescription="Beds &amp; Houses">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
  </CategoryList>
  <CategoryList>
    <Category CategoryId="58782" CategoryPath="0100" Description="Fashion (new)" ShortDescription="Fashion">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
    <Category CategoryId="49056" CategoryPath="0100/6958" Description="Blazers &amp; Jackets, Etc. - Department" ShortDescription="Blazers &amp; Jackets, Etc.">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
    <Category CategoryId="50851" CategoryPath="0100/6958/7837" Description="Dusters PDM Name" ShortDescription="Dusters PDM Display Name">
      <Extn>2021-11-16T17:00:00-06:00</Extn>
    </Category>
  </CategoryList>
</CategoryListArray>

Update: fixed CategoryList grouping

  • Related