{
"customer": [
{
"account":{
"number": 12345,
"serno": 4000,
"card": {
"id": "a",
"number": "a***"
}
}
},
{
"account":[
{
"number": 33333,
"serno": 1000,
"card": {
"id": "a",
"number": "a***"
}
},
{
"number": 22222,
"serno": 2000,
"card": [
{
"id": "a",
"number": "b***"
},
{
"id": "a",
"number": "c***"
},
{
"id": "a",
"number": "d***"
}
]
}
]
}
]
}
脚本
%dw 2.0
output application/json
var itemsArr = flatten(payload.customer map ((item) -> item.account.number))
var reducedItems = itemsArr reduce ((item, acc) -> item ++ "," ++ acc)
var foundItem = (flatten(payload.customer.account) filter((item) -> item.number == 22222))
var obValues = [
{
"number" : 22222,
"val": 113
},
{
"number" : 33333,
"val": 20
},
{
"number" : 12345,
"val": 30
},
]
---
flatten(payload.customer.account) map ((item) ->
obValues map ((ob) ->
if(item.number == ob.number)
item update {
case .serno -> 54435325345
} else 0)
)
我尝试了上述方法但没有成功,它非常接近我需要的数据,但我最终希望更新有效负载中每个“帐户”对象上的“serno”属性,如果“帐户”。“数字”是发现位于 obValues 数组中。 “serno”属性应该是来自与“ob”.“number”匹配的相关 obValue 对象的“val”。任何帮助我指明正确方向的帮助将不胜感激。
flatten(payload.customer.account) map ((item) ->
obValues map ((ob) ->
if(item.number == ob.number)
item update {
case .serno -> 54435325345
} else 0)
)
但是,这会在有效负载响应中放置额外的 0
首先要准确理解您想要实现的输出是什么,并有示例来验证它是否正确,这一点很重要。一旦您能用文字表达出来,您就可以将其翻译成 DataWeave 表达式。此外,您还应该熟悉该语言才能使用正确的功能。脚本应该传达您想要做的事情的意图,以便读者清楚地了解。
问题中的预期输出并不完全清楚。根据我的理解,我开始更新客户数组中的值。为此,您可以使用 update 运算符,它可以简化仅修改我们感兴趣的键的操作。然后您需要更新每个帐户,但是帐户可以是单个对象或数组,因此我们需要决定在每种情况下做什么。我使用模式匹配来做出决定。为了避免使表达式过于复杂,我们可以将其部分封装在函数中,使其更具可读性。最后,如果函数在 obValues 中找到匹配的数字,则更新 serno 值。在上一场比赛中,如果它是单个对象,我调用更新函数,如果它是数组,我为每个项目调用它。
我的脚本:
%dw 2.0
output application/json
var obValues = [ { "number" : 22222, "val": 113 }, { "number" : 33333, "val": 20 }, { "number" : 12345, "val": 30 }, ]
fun accountInOb(n)=obValues dw::core::Arrays::firstWith(((ob) -> ob.number == n))
fun updateSingleAccount(a)=
a update {
case .serno -> accountInOb(a.number) default $
}
fun updateAccount(a)=
a.account match {
case is Array -> $ map (updateSingleAccount($))
case is Object -> updateSingleAccount($)
}
---
payload update {
case c at .customer -> c map (updateAccount($))
}
输出:
{
"customer": [
{
"number": 12345,
"serno": {
"number": 12345,
"val": 30
},
"card": {
"id": "a",
"number": "a***"
}
},
[
{
"number": 33333,
"serno": {
"number": 33333,
"val": 20
},
"card": {
"id": "a",
"number": "a***"
}
},
{
"number": 22222,
"serno": {
"number": 22222,
"val": 113
},
"card": [
{
"id": "a",
"number": "b***"
},
{
"id": "a",
"number": "c***"
},
{
"id": "a",
"number": "d***"
}
]
}
]
]
}