/dataweave-scripts

Set of scripts in DataWeave

Primary LanguageDataWeave

DataWeave Scripts

DataWeave is a powerful transformation language that is used to transform data from one format to another. It is a core component of MuleSoft Anypoint Platform.

1. Transform

1.1. XML to JSON - Force Keys as Array

This script will convert an XML payload to a JSON payload. It will force keys to be arrays if there is only one element with that key since duplicateKeyAsArray only works when there are multiple elements with the same key.

Input XML Payload:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <About>
    <Code>29329573000145</Code>
    <Name>COMPANY X</Name>
    <CodeStatus>Ativa</CodeStatus>
  </About>
  <Emails>
    <Email>contact@company.com</Email>
  </Emails>
  <Emails>
    <Email>contact2@company.com</Email>
  </Emails>
  <Phones>
    <AreaCode>19</AreaCode>
    <Phone>34140000</Phone>
  </Phones>
  <Phones>
    <AreaCode>19</AreaCode>
    <Phone>34370005</Phone>
  </Phones>
  <Mobiles>
    <AreaCode>11</AreaCode>
    <Phone>912341234</Phone>
  </Mobiles>
  <Mobiles>
    <AreaCode>11</AreaCode>
    <Phone>956785678</Phone>
  </Mobiles>
</Root>
DataWeave Script:
%dw 2.0
var root = 'Root'
var arrayKeys = ["Emails", "Phones", "Mobiles"]
var objectKeys = keysOf( (payload.'$(root)' default {}) as Object) -- (arrayKeys)
---
{
	(objectKeys map {
		(($): ((payload.'$(root)'.'$($)' default {}) as Object mapObject ((value, key, index) ->
        (key): (value match {
            case is String -> (
              if(trim(value) ~= "NULL") null else trim(value)
            )
            else -> value
        })
    )))
	}),
	(
		arrayKeys map {
		(
			($): (
				(payload.'$(root)'.*'$($)' default []) as Array map ((item, index) ->
					item as Object mapObject ((value, key, index) ->
						(key): (value match {
                case is String -> (
                  if(trim(value) ~= "NULL") null else trim(value)
                )
                else -> value
            })
					)
				)
			)
		) if(payload.'$(root)'.'$($)'?)
	})
}
Output JSON Payload:
{
  "About": {
    "Code": "29329573000145",
    "Name": "COMPANY X",
    "CodeStatus": "Ativa"
  },
  "Emails": [
    {
      "Email": "contact@company.com"
    },
    {
      "Email": "contact2@company.com"
    }
  ],
  "Phones": [
    {
      "AreaCode": "19",
      "Phone": "34140000"
    },
    {
      "AreaCode": "19",
      "Phone": "34370005"
    }
  ],
  "Mobiles": [
    {
      "AreaCode": "11",
      "Phone": "912341234"
    },
    {
      "AreaCode": "11",
      "Phone": "956785678"
    }
  ]
}
DataWeave Playground