使用dataweave

问题描述

我正在尝试使用dataweave从输入有效负载中匹配特定值。

输入:

{
    "drives": [{
        "id": "0AEzOyzyCb7Uk9PVA","name": "SFJob-2020-10"
    },{
        "id": "0AMEHi1wsq-8FUk9PVA","name": "SFJobs-2020-11"
    } ],"nextPagetoken": "~!!~AI9FV7RV4uSXy20zpCBTP2LFWCXS0c"
},{
    "drives": [{
        "id": "0AEz3mOyzyCb7Uk9PVA","name": "Dev2020-10"
    },"name": "Dev2020-11"
    }],"nextPagetoken": "~!!~AI9P2LFWCXS0c"
}

如何检查是否存在“ Dev2020-10”值。

我正在使用下面的代码给我错误

%dw 2.0
output application/json
---
payload.drives filter ((item,index) -> item.name == 'Dev2020-10')

预期输出

[ {

"id": "0AEz3mOyzyCb7Uk9PVA","name": "Dev2020-10"

} ]

我该如何实现?

解决方法

首先,输入无效。我假设它应该是JSON数组,所以将其放在方括号中:[ {..},{..} ]

此后,您将注意到过滤器需要一个对象,但是由于它是一个数组,因此需要首先对其进行映射。为了返回单个数组,我使用了flatMap():

%dw 2.0
output application/json
---
payload flatMap $.drives filter ((item,index) -> item.name == 'Dev2020-10')

输出:

[
  {
    "id": "0AEz3mOyzyCb7Uk9PVA","name": "Dev2020-10"
  }
]
,

解决方案可以考虑两个步骤:

  1. 将所有驱动器合并在一起以获取对象flatten(inputArray.drives)的单个阵列
  2. 根据搜索条件filter ((item,index) -> item.name == "Dev2020-11")过滤新的对象数组

解决方案将是这样:

%dw 2.0
output application/json

var inputArray = [
    {
    "drives": [{
        "id": "0AEzOyzyCb7Uk9PVA","name": "SFJob-2020-10"
    },{
        "id": "0AMEHi1wsq-8FUk9PVA","name": "SFJobs-2020-11"
    } ],"nextPageToken": "~!!~AI9FV7RV4uSXy20zpCBTP2LFWCXS0c"
    },{
    "drives": [{
        "id": "0AEz3mOyzyCb7Uk9PVA","name": "Dev2020-10"
    },"name": "Dev2020-11"
    }],"nextPageToken": "~!!~AI9P2LFWCXS0c"
    }
]
---
flatten(inputArray.drives) filter ((item,index) -> item.name == "Dev2020-11") 

要了解有关展平方法的更多信息,请参阅文档:mule 4 doc