Mule Dataweave:过滤与默认功能组合使用无效

时间:2018-02-04 22:21:09

标签: mule mule-component dataweave mule-el

我正在使用Mule dataweave,这是我的请求,我想filter我的请求code ==“P”如果请求包含Code = p不存在则始终默认为code ==“ C“因为代码= C始终存在于传入请求中。

请求:

{
   "addresses": [
     {
        "contact": 0,
        "code": "P",
        "TypeDescription": "POSTAL",
        "postcode": "1007",
        "State": "TamilNadu",
        "Description": "Test",         
    },
    {
        "contact": 1,
        "code": "C",
        "TypeDescription": "PHYSICAL",
        "postcode": "Bangalore",
        "State": "",
        "Description": "NEW",

    }
 ] 
}

Dataweave:

 %dw 1.0
 %output application/json
 ---
 payload.addresses filter $.code == "P"  

它工作正常并过滤掉了包含P的列表,但是当尝试filterdefault结合使用时,它不会。

我在dataweave payload.addresses filter $.code == "P1" default "anything here as of now"中尝试过以下内容。

由于在上面的响应中我正在过滤请求中不存在的P1,因此我期待响应中的default内容。但它没有用。

注意:使用when和其他方式,使列表两次。我只需要一个列表作为响应,包含Code P包含列表或C包含列表。

使用MUle 3.8.5 V.请让我知道你的想法。提前谢谢。

3 个答案:

答案 0 :(得分:1)

根据我的理解,Dataweave从右到左工作,所以在这种情况下评估是这样的:

  1. '“P1”默认“现在任何东西”'解析为“P1”
  2. 在'payload.addresses'
  3. 上运行'filter $ .code ==“P1”'

    当然,第一个选项将始终评估为“P1”,因此默认基本上被忽略。您需要在表达式的其余部分周围使用括号,然后使用默认值进行操作。现在它将评估括号,然后是默认表达式。

    例如:(payload.addresses过滤$ .code ==“P1”)默认“此处的任何内容”

    这不是一个很好的例子,因为如果没有选项匹配,过滤器将返回一个空列表,而不是null,因此默认值不起作用。您可以尝试这样的答案:https://stackoverflow.com/a/44431546/2614624

答案 1 :(得分:0)

在局部变量中创建默认值,并在过滤时使用OR条件。 示例如下。

{
  biggerThanTwo: [0, 1, 2, 3, 4, 5] filter (($ > 2) OR ($ ==1))
}

答案 2 :(得分:0)

这是我的解决方案。正如@Clinton所提到的,Filter返回Empty数组不为null,这是它的解决方法

%dw 1.0 %输出应用程序/ java

%var conditionalRoute = payload.addresses过滤$ .addressTypeCode ==" P"

conditionalRoute when ConditionRoute!= []否则"此处的任何内容截至目前为止"