【问题标题】:How to filter an array of JSON in Mule DataWeave如何在 Mule DataWeave 中过滤 JSON 数组
【发布时间】:2017-09-15 05:14:28
【问题描述】:

我有一个这样的 JSON:

{
  "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": ""
       }
      ]
    }
  }
 }

我们需要从这个输入 JSON 中提取 payload.profile.base.phone.number,其中 payload.profile.base.phone.type == "mobile" 和 payload.profile.base.phone.activeInd == " Y”。实际上,我们需要遍历 JSON 数组 (payload.profile.base.*phone) 并仅获取处于活动状态且类别/类型为 mobile 的电话号码。

我们需要如下输出:

{
  "dcsId": "1184001100000000517",
  "marketCode": "US",
  "languageCode": "en-US",
  "username" :  "arunima27", 
  "phoneNumber" : "2234566788"
}  

我们在对“phoneNumber”输出变量进行这种转换时遇到了问题。

【问题讨论】:

    标签: mule dataweave


    【解决方案1】:

    从您的预期结果看来,您只想要第一个匹配的数字。这里的 dataweave 正是这样做的:

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

    如果您想要所有匹配的电话号码,只需将[0] 留出,结果中phoneNumber 的值将是一个数组(不仅仅是第一个匹配的电话号码)。

    【讨论】:

      【解决方案2】:

      这已经解决了问题。

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

      【讨论】:

        【解决方案3】:

        在手机上使用filterma​​p来达到想要的效果。

        phoneNumber: {
            (payload.profile.base.phone filter ($.activeInd == "Y" and $.type == "mobile") map {
                number: $.number
            }
        )}
        

        输出

        "phoneNumber": {
            "number": "2234566788",
         }
        

        【讨论】:

        • 不,phoneNumber 不会是一个数组。如果有多个匹配的电话号码,您的 dataweave 将产生无效的 JSON。 phoneNumber 将是一个对象,包含带有键 number 的属性
        【解决方案4】:
         %dw 2.0
         output application/json
         ---
         payload.profile.base.phone filter ((obj, index) -> (obj.activeInd == 'Y' and obj.type  ~= 'mobile'   )) 
        

        【讨论】:

        • 请对 sn-p 使用代码格式
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2021-03-26
        • 1970-01-01
        • 2017-05-20
        相关资源
        最近更新 更多