remove all the extra lines from the array in mule 4 - mule

I want to remove the extra lines or "\n\r" & "\n" from the array but my solution is not working. Please provide the correct function or dataweave for this.
input (json array format):
[{"m":"a\n\r",
"a":"b\n"},
{"m":"a\r\n",
"a":"b\n"}]
expected output(json array format):
[{"m":"a",
"a":"b"},
{"m":"a",
"a":"b"}]
code:
%dw 2.0
var someSpaceJson = write(payload, "application/json", {"indent":false})
output application/json
---
someSpaceJson replace "\n\r" with ""

You need to specify \\ instead of \ to represent the escape char.
%dw 2.0
var someSpaceJson = write(payload, "application/json", {"indent":false})
output application/json
---
read((someSpaceJson replace "\\r" with "" replace "\\n" with ""),"application/json")
This should give you your desired output.

If you want to preserve the new lines between the values and only want to remove the trailing \r's and \n's you can use the following. This will also avoid converting JSON to string and back which generally should be avoided.
%dw 2.0
output application/json
---
payload map ($ mapObject ($$): trim($))
However, you need to make sure that all values are string or null. If that is not the case you can add those conditions in the mapObject function itself.

Related

override skipNullOn="everywhere"

I have divided my dataweave script into modules, and I have used skipNullOn="everywhere" in the main dwl, so all the null values in all the modules are skipped. But, I don't want to skip the null values of a particular modules. How do I override(nullify) the skipNullOn="everywhere" for that particular module.
Input:
<XML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ABC xsi:nil="true"/>
<DEF/>
</XML>
dataweave code:
%dw2.0
output application/json skipNullOn="everywhere"
---
payload.XML
Expected Output(
json):
{
"ABC": ""
}
Getting Output(json):
{
}
Since I am answering it pretty late, I am not sure if this of much help to you. Anyways, you can have the list of nodes for which you want to skip the 'skipNullOn' check in a comma separated format in the property file. And then you try something similar as I have here below, which will help you iterate over all the nodes and then achieve the output as you desire:
%dw 2.0
output application/json skipNullOn="everywhere"
var toSkipNullOn='ABC,XYZ'
fun checkNull(key,val) = if((toSkipNullOn splitBy(',')) contains(key as String)) '' else null
---
payload.XML mapObject (v0, k0, i0) ->
{
(k0):checkNull(k0,v0)
}
In this example I have hardcoded the node names (ABC,XYZ) to the variable toSkipNullOn. Instead of that you'll have to read it from the property file as p('key-name') and assign it to toSkipNullOn.
You need to explicitly write the logic for that field, should be something like this
%dw2.0
output application/json skipNullOn="everywhere"
---
{
"ABC": if (payload.XML.ABC_val !=null ) else ""
}
You can try this workaround, to get the expected result. Use two dataweave
1st Dataweave (wherever you get "nil", syntax need to be updated as the below one)
%dw 2.0
output application/xml skipNullOn="everywhere"
ns xsi http://www.w3.org/2001/XMLSchema-instance
---
{
ABC #( xsi#nil:"true"): payload.ABC ,
DEF : payload.DEF
}
2nd Dataweave
%dw 2.0
output application/json
---
payload
You can then replace null with "" easily.

Dataweave check if a value is contained within a YAML list

I want to check if the value present in the YAML list.
I have product.yaml
intGrp:
- "A"
- "CD"
- "EF"
- "ABC"
- "CDEF"
From transform message I want to check
If (intGrp contains payload.myvalue) this else that
Tried
%dw 2.0
var prop = Mule::p('intGrp')
output application/json
---
{
a: prop contains ("A")
}
But that doesn't solve my problem. Because I want to do an exact string match. i.e if I give
a: prop contains ("AB") I should get a false as there is no product as "AB".
Any help would be highly appreciated.
Thank you
The problem is that the YAML array is interpreted as a comma separated string in the property. The contains() function works differently in strings than in array. In strings it searches for a matching substring, hence 'AB' returns true. You could convert the string it back to an array using the splitBy() DataWeave function. I'm showing both side by side to highlight the difference:
%dw 2.0
var prop = Mule::p('intGrp')
var propArray = Mule::p('intGrp') splitBy ','
output application/json
---
{
raw: prop,
array: propArray,
a: propArray contains ("A"),
ab: propArray contains ("AB")
}
The output is:
{
"raw": "A,CD,EF,ABC,CDEF",
"array": [
"A",
"CD",
"EF",
"ABC",
"CDEF"
],
"a": true,
"ab": false
}
Note that if any of the entries contains a comma it will be split too.

how to remove specific fields from map using dataweave mule

how to remove specific fields from map using dataweave
input:
{
a:1,
b:2,
c:3,
d:4
}
I want to remove c and d fields(c and d values are dynamic) and display only
output
{
a:1,
b:2
}
How can we do it in data weave
According to the Dataweave Reference Documentation, you can remove a field from an object. Try using this:
%dw 1.0
%output application/json
---
payload - "c" - "d"
Below code works fine:
%dw 2.0
var arr=["c","d"]
output application/json
---
payload filterObject ((value, key, index) -> !(arr contains (key) as String))
You can add/remove the keys that you want to exclude in the variable 'arr'.

There is no variable named 'substring'

i want to Change the time "2017-08-22T17:10:12Z" into "20170822".
So i used this substring function but its throw errors continuously.
%dw 0.1
%output application/xml
---
po: {
var:payload.po.ordered_date,
Date: substring(var,2,3)
}
There is no function called substring in Dataweave instead use as given below.
%dw 0.1
%output application/xml
po: {
var:payload.po.ordered_date,
Date: substring(2..3)
}
Or you can define a Java function substring in global xml config file and use it as you have given above.
Variable declaration has syntax error. Also in dataweave substring doesnt work as mentioned. Please refer following code
%dw 0.1
%output application/xml
%var variable = payload.po.ordered_date
---
po: {
Date: variable as :localdatetime as :string {format:"yyyyMMdd"}
}
Hope this helps.
I use Groovy Script to retrieve the substring. Try like below.
def testString = 'ABC';
flowVars['subStringedString']= flowVars.testString.substring(0,2);
The above will give you AB.
You can access this substring as flowVars['subStringedString'] in Mule flow
There is no substring operator in Dataweave and the way you to do this is like var[1..3] is you want get 4 characters from 2nd position. Should be something on lines below
%dw 0.1
%output application/xml
---
po: {
var:payload.po.ordered_date,
Date: var[1..3]
}

How to append the first and last with " double quotes for dw variable in Dataweave mule

%output application/json
%var EmpIds=flowVars.empIDMap.EmpIds
---
payload map using(eNumber=$.EMPLOYEE) {
content: EmpIds.eNumber,
}
If i add value within double quotes i am getting value for example EmpIds."6" for
Need to append the first and last with " double quotes to get the value from EmpIds based on eNumber.
empIDMap data is :: {EmpIds={6=2, 19=3, 21=4, 36=5, 168421=6, 167727=7, 167729=8, 161759=9, 162052=10, 157633=11}}
can you please help on this.
To get value as string try eNumber= $.EMPLOYEE ++ "". This works fine.