How to append the first and last with " double quotes for dw variable in Dataweave mule - 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.

Related

remove all the extra lines from the array in mule 4

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.

"Cannot coerce Null to String" in mule 4

%dw 2.0
import * from dw::core::Binaries
output application/json
var userCredentials = vars.userCredentials.userName as String ++ ":" ++ vars.userCredentials.password as String
---
"Basic "++ toBase64(userCredentials as String)
Error [MULE:EXPRESSION] while running test 'get-authorization-token-test-success':"Cannot coerce Null (org.mule.weave.v2.model.values.NullValue$#799da78a) to String
1| %dw 2.0 import * from dw::core::Binaries output application/json var userCredentials = vars.userCredentials.userName as String ++ ":" ++ vars.userCredentials.password as String --- "Basic "++ toBase64(userCredentials as String)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Trace:
at ++ (line: 1, column: 89)
at ++ (line: 1, column: 129)
at main (line: 1, column: 136)" evaluating expression: "%dw 2.0 import * from dw::core::Binaries output application/json var userCredentials = vars.userCredentials.userName as String ++ ":" ++ vars.userCredentials.password as String --- "Basic "++ toBase64(userCredentials as String)".
I'll assume that the question is what is causing the error shown. The error is self describing really: You can not concatenate a null with a String. The underlined part of the script indicates the location of the issue. The problem seems to be that either the variable vars.userCredentials is null or it doesn't contain an attribute called userName. You'll have to figure why it reaches the script with a null value and fix it.
Double check the value stored in the vars.userCredentials. This error comes when this value or its elements userName or password are null.
In your data weave, you have written the statement vars.userCredentials.userName as String, which in runtime gets executed as null as String ==> and hence Mule runtime engine is throwing an error.

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.

string to date conversion using dataweave

Input String: 201801
Output String format: 01.2018
I tried using following but it's not working, I also looked up for string to date convesrion/coercion table in "Type Coercion Table" https://docs.mulesoft.com/mule-user-guide/v/3.8/dataweave-types#type-coercion-table. I did not find something to help me with this.
as :date {format: "yyyyww"} as :string {format: "ww.yyyy"}
Appreciate if anyone has any ideas to share.
If you don't mind a bit of string hackery you could just move the various parts of the input string around:
%dw 1.0
%output application/json
%var inputDate = "201801"
---
{
outputDate: inputDate[4..5] ++ "." ++ inputDate[0..3]
}
The output of that is
{
"outputDate": "01.2018"
}
The above isn't null safe though, if there is a chance that the input date string is empty, or if it is shorter than 6 characters you will get a runtime error. You could work around that by checking the date in the DW, something like
outputDate: (inputDate[4..5] ++ "." ++ inputDate[0..3]) when inputDate != null and ( sizeOf inputDate ) == 6 otherwise null

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]
}