How to filter an array of JSON in Mule DataWeave

北战南征 提交于 2019-12-10 15:57:57

问题


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.


回答1:


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




回答2:


This has solved the problem.

{(payload.profile.base.phone filter ($.activeInd == "Y" and $.primaryInd== "Y"))}.number default ""




回答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",
 }


来源:https://stackoverflow.com/questions/43487855/how-to-filter-an-array-of-json-in-mule-dataweave

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!