如何在 Mule DataWeave 中过滤 JSON 的数组
How to filter an array of JSON in Mule DataWeave
我有这样的 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) 并仅获取 phone 处于活动状态且类别/类型为移动的号码。
我们需要如下输出:
{
"dcsId": "1184001100000000517",
"marketCode": "US",
"languageCode": "en-US",
"username" : "arunima27",
"phoneNumber" : "2234566788"
}
我们在对 "phoneNumber" 输出变量进行此转换时遇到问题。
这已经解决了问题。
{(payload.profile.base.phone 过滤器 ($.activeInd == "Y" and $.primaryInd== "Y"))}.number default ""
从您的预期结果来看,您似乎只需要第一个匹配的数字。这是数据编织正是这样做的:
%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
}
如果您想要所有匹配的 phone 数字,只需将 [0]
去掉,结果中 phoneNumber
的值将是一个数组(不仅仅是第一个匹配的 phone个数).
在 phone 上使用 filter 和 map 以获得所需的结果。
phoneNumber: {
(payload.profile.base.phone filter ($.activeInd == "Y" and $.type == "mobile") map {
number: $.number
}
)}
输出
"phoneNumber": {
"number": "2234566788",
}
%dw 2.0
output application/json
---
payload.profile.base.phone filter ((obj, index) -> (obj.activeInd == 'Y' and obj.type ~= 'mobile' ))
我有这样的 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) 并仅获取 phone 处于活动状态且类别/类型为移动的号码。
我们需要如下输出:
{
"dcsId": "1184001100000000517",
"marketCode": "US",
"languageCode": "en-US",
"username" : "arunima27",
"phoneNumber" : "2234566788"
}
我们在对 "phoneNumber" 输出变量进行此转换时遇到问题。
这已经解决了问题。
{(payload.profile.base.phone 过滤器 ($.activeInd == "Y" and $.primaryInd== "Y"))}.number default ""
从您的预期结果来看,您似乎只需要第一个匹配的数字。这是数据编织正是这样做的:
%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
}
如果您想要所有匹配的 phone 数字,只需将 [0]
去掉,结果中 phoneNumber
的值将是一个数组(不仅仅是第一个匹配的 phone个数).
在 phone 上使用 filter 和 map 以获得所需的结果。
phoneNumber: {
(payload.profile.base.phone filter ($.activeInd == "Y" and $.type == "mobile") map {
number: $.number
}
)}
输出
"phoneNumber": {
"number": "2234566788",
}
%dw 2.0
output application/json
---
payload.profile.base.phone filter ((obj, index) -> (obj.activeInd == 'Y' and obj.type ~= 'mobile' ))