How to filter an array of JSON in Mule DataWeave

Mohit Mehrotra picture Mohit Mehrotra · Apr 19, 2017 · Viewed 21.6k times · Source

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.

Answer

Yevgeniy picture Yevgeniy · Apr 19, 2017

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).