Skip to content

AndyDaSilva52/dataweave-scripts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 

Repository files navigation

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>[email protected]</Email>
  </Emails>
  <Emails>
    <Email>[email protected]</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
output application/json
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": "[email protected]"
    },
    {
      "Email": "[email protected]"
    }
  ],
  "Phones": [
    {
      "AreaCode": "19",
      "Phone": "34140000"
    },
    {
      "AreaCode": "19",
      "Phone": "34370005"
    }
  ],
  "Mobiles": [
    {
      "AreaCode": "11",
      "Phone": "912341234"
    },
    {
      "AreaCode": "11",
      "Phone": "956785678"
    }
  ]
}
DataWeave Playground

1.2. XML to JSON - Mask Sensitive Data

This script will mask sensitive data in the XML text. It will use the logger.dataMaskingFieldsCSV property to define the fields that will be masked.

Input XML Payload:
<?xml version="1.0" encoding="WINDOWS-1252"?>
<Root>
  <Participant>
    <AccountNumber>376400</AccountNumber>
    <Name>JOHN</Name>
    <PhoneNumber>+5500123451234</PhoneNumber>
    <Email></Email>
    <Id>1</Id>
    <DocumentNumber>00000000000</DocumentNumber>
  </Participant>
</Root>
DataWeave Script:
%dw 2.0
output application/json
fun xmlTextMaskSensitiveData(xml, fields) = do {

    (flatten(

    fields map ((field, idx) ->

				xml scan ("(\<$(field)\>)(.+)(\<\/$(field)\>)" as Regex) map ((found, index) ->

					if(!isEmpty(found[2]))
							{
									o: "$(field)>"++ found[2] ++"</$(field)",
									r: "$(field)>***</$(field)",
							}
					else
					null

				)

			)

    ) filter !isEmpty($) )

    reduce ((texto, x = xml) ->
      x
        replace (texto.o as String)
        with (texto.r as String)
    )

}
---
{
    original: payload.XML,
    masked: xmlTextMaskSensitiveData(payload.'XML', (Mule::p("logger.dataMaskingFieldsCSV") splitBy  ",") )
}
Output JSON Payload:
{
  "original": "<?xml version=\"1.0\" encoding=\"WINDOWS-1252\"?><Root><Participant><AccountNumber>376400</AccountNumber><Name>JOHN</Name><PhoneNumber>+5500123451234</PhoneNumber><Email></Email><Id>1</Id><DocumentNumber>00000000000</DocumentNumber></Participant></Root>",
  "masked": "<?xml version=\"1.0\" encoding=\"WINDOWS-1252\"?><Root><Participant><AccountNumber>376400</AccountNumber><Name>JOHN</Name><PhoneNumber>***</PhoneNumber><Email></Email><Id>1</Id><DocumentNumber>***</DocumentNumber></Participant></Root>"
}
DataWeave Playground

About

Set of scripts in DataWeave

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published