How to filter an array of JSON in Mule DataWeave
Solution 1
This has solved the problem.
{(payload.profile.base.phone filter ($.activeInd == "Y" and $.primaryInd== "Y"))}.number default ""
Solution 2
from your expected result it looks like you only want the first matching number. here is the dataweave doing exactly this:
%dw 1.0
%output application/json
---
{
dcsid: payload.dcsId,
markCode: payload.marketCode,
languageCode: payload.languageCode,
username: payload.profile.base.username,
phoneNumber: (payload.profile.base.phone filter ($.activeInd == 'Y' and $.type == 'mobile'))[0].number
}
if you want all matching phone numbers, just leave the [0]
out and the value of phoneNumber
in the result will be a array (not just the first matching phone number).
Solution 3
Use filter and map on phone to achieve the desired result.
phoneNumber: {
(payload.profile.base.phone filter ($.activeInd == "Y" and $.type == "mobile") map {
number: $.number
}
)}
Output
"phoneNumber": {
"number": "2234566788",
}
Mohit Mehrotra
Updated on July 17, 2022Comments
-
Mohit Mehrotra almost 2 years
I am having a JSON like this :
{ "dcsId": "1184001100000000517", "marketCode": "US", "languageCode": "en-US", "profile": { "base": { "username": "arunima27", "activeInd": "R", "phone": [ { "activeInd": "Y", "type": "mobile", "primaryInd": "Y", "number": "2234566788" }, { "activeInd": "N", "type": "mobile", "primaryInd": "N", "number": "" } ] } } }
From this input JSON we need to extract the payload.profile.base.phone.number where the payload.profile.base.phone.type == "mobile" and payload.profile.base.phone.activeInd == "Y". Actually we need to loop through the JSON array (payload.profile.base.*phone) and get only the phone numbers which are active and having the category / type as mobile.
We need the output like below :
{ "dcsId": "1184001100000000517", "marketCode": "US", "languageCode": "en-US", "username" : "arunima27", "phoneNumber" : "2234566788" }
We are facing problem in doing this transformation for the "phoneNumber" output variable.