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.
Related
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.
New to Mule4 and have a question.
I am posting a simple xml file using postman
<cust>
<act>1234</act>
</cust>
In my flow I have
Listener->TransformMessage->logger
Inside TransformMessage I have the following:
Added a new target called f1 as variable
%dw 2.0
output application/java
var myXML = payload
---
{
f1: myXML.cust.act
}
And in the logger I am printing the value using #[vars.f1] and the output I am getting is {f1=1234} which is right.
So my question is how can I only get the value “1234” out of it? Reason is let says I want to use this in a query, for example
Select name, address from account where accountNumber = ':vars.f1'
Thanks
The problem is that you are wrapping the result in an object with a field f1
%dw 2.0
output application/java
var myXML = payload
---
{
f1: myXML.cust.act
}
So what you should do is just return the value like
%dw 2.0
output application/java
var myXML = payload
---
myXML.cust.act
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'.
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]
}
Hi i am trying to write a conditional expression instead of using when in data weave. I am not getting how to achieve this.
I am trying to write something as mention below to filter condition with in the statement:
%dw 1.0
%output application/java
---
{
data: payload,
paylo: (sizeOf payload) < 20 ? 90:0
}
The below code would help you for applying the condition
%dw 1.0
%output application/java
---
{
data: payload,
paylo: 90 when sizeOf payload < 20 otherwise 0
}
The documentation should help you understand sizeOf and conditional statements