Key value pair from object array

Hi,
I would like to create the below outbound message from an incoming object array.

{
    "root": {
        "elementName": {
            "@attributeName": "attributeValue",
            "$": "elementValue"
        },
        "repeatedElement": [
            {
                "key": {
                    "@attr": "attr1",
                    "$": "key1"
                },
                "value": "value1"
            },
            {
                "key": {
                    "@attr": "attr2",
                    "$": "key2"
                },
                "value": "value2"
            }
        ]
    }
}

Any suggestion please on the repeated elements, attributes, and values?
Thanks,
Deepak Shaw

Hey @deepak.shaw,

Are you able to share a sample of the incoming data?

Hi,
Yes, Attached the incoming message.

Looking forward for your suggestion/solution.
Regards,
Deepak.

Hi @bojanvelevski , the required file is attached.

The objects contain quite a lot information, so please share some info on which are the corresponding fields that you want in your output.

Hi @bojanvelevski ,
I have updated the message with the minimum required fields. Hopefully
Group_By Fields output0.json (489 Bytes)
it gives a better understanding.
Regards,
Deepak.

It’s a bit confusing. repeatedElement it’s obviously the InvoiceLines object, but in your output sample, the objects contain only one key value pair:

 {
                "key": {
                    "@attr": "attr1",
                    "$": "key1"
                },
                "value": "value1"
     } 

While in the incoming data, one object contains four fields:

{
        "LineNumber": "1",
        "LineExtAmtExclTax": "7000",
        "Employee": "Marlon Mangila",
        "LineTax": "700"
      }

Quickly use those fields to manually populate this output object from above, just as a reference.

Hi @bojanvelevski ,
Just to clarify here are input & output messages:
input:

[
  {
    "Header": {
      "InvoiceNumber": "PRP100418",
      "InvoiceDate": "29/04/2022",
      "PaymentTermsDescription": "Net 7 days",
      "CustomerRef": "C1381"
    },
    "InvoiceLines": [
      {
        "LineNumber": "1",
        "LineExtAmtExclTax": "7000",
        "Employee": "Marlon Mangila",
        "LineTax": "700"
      },
      {
        "LineNumber": "2",
        "LineExtAmtExclTax": "800",
        "Employee": "Elin Joe",
        "LineTax": "150"
      }
    ]
  }
]

output:

{
    "Invoice": {
        "InvoiceNumber": {
            "@attributeName": "PRP100418",
            "$": "C1381"
        },
        "InvoiceLines": [
            {
                "LineNumber": {
                    "@LineExtAmtExclTax": "7000",
                    "$": "1"
                },
                "value": "Marlon Mangila"
            },
            {
                "LineNumber": {
                    "@LineExtAmtExclTax": "8000",
                    "$": "2"
                },
                "value": "Elin Joe"
            }
        ]
    }
}

Looking forward to your suggestion.
Regards,
Deepak.

Done, check the pipeline and let me know if this works for you. Can be made with multiple mappers or a JSON Schema as well, but this is simpler in terms of snaps usage.

Key value pair from object array_2022_05_20.slp (4.3 KB)

3 Likes

Hi @bojanvelevski , Amazing :slight_smile: it’s working as expected.
Can you please explain a bit about the code you have written in the map i.e.

$InvoiceLines.map(x=>{"LineNumber":{"@LineExtAmtExclTax":x.LineExtAmtExclTax,"$":x.LineNumber},"value":x.Employee})

Many thanks for your help,
Deepak Shaw.

$InvoiceLines.map(x=>{"LineNumber":{"@LineExtAmtExclTax":x.LineExtAmtExclTax,"$":x.LineNumber},"value":x.Employee})

I’m glad I could help.

With the expression above, we’re mapping a specific value to every object inside the $InvoiceLines array. Basically the .map() function will iterate through the array, and for every object, it will map a JSON structure, using the values of that object.

3 Likes

Thanks @bojanvelevski