我的示例有效载荷如下。
{
"Identifier": "1111111111",
"Type": "Test",
"Codes": [
{
"CodeId": "112233-ABC",
"Code": {
"ID": "112233",
"Name": "ABC"
}
},
{
"CodeId": "445566-DEF",
"Code": {
"ID": "445566",
"Name": "DEF"
}
},
{
"CodeId": "778899-GHI",
"Code": {
"ID": "778899",
"Name": "GHI"
}
}
]
}
我有2个会话变量,如下所示。
%var var1 =
{
"112233": "900123",
"445566": "900456",
"778899": "900789"
}
%var var2 =
{
"value": [
{
"Desc": "Alpha",
"TempId": 900123
},
{
"Desc": "Bravo",
"TempId": 900456
},
{
"Desc": "Charlie",
"TempId": 900789
}
]
}
我需要的是对这两个变量进行动态查找,并在主payload中添加新的属性,如下所示。
{
"Identifier": "1111111111",
"Type": "Test",
"Codes": [
{
"CodeId": "112233-ABC",
"Code": {
"ID": "112233",
"Name": "ABC",
"Description": "Alpha"
}
},
{
"CodeId": "445566-DEF",
"Code": {
"ID": "445566",
"Name": "DEF",
"Description": "Bravo"
}
},
{
"CodeId": "778899-GHI",
"Code": {
"ID": "778899",
"Name": "GHI",
"Description": "Charlie"
}
}
]
}
我的想法是使用 价值 从var1对 TempId 在var2中,得到 下载. 这必须通过与ID匹配添加到代码数组中。如果没有找到值,则插入null。我在dataweave 1.0上。
先谢谢你
你可以试试下面的脚本。有两个查询,第一个是来自于 var
以获得 TempId
其次是增加 Desc
领域
%dw 1.0
%input payload application/json
%output application/json
%var var1 =
{
"112233": "900123",
"445566": "900456",
"778899": "900789"
}
%var var2 =
{
"value": [
{
"Desc": "Alpha",
"TempId": 900123
},
{
"Desc": "Bravo",
"TempId": 900456
},
{
"Desc": "Charlie",
"TempId": 900789
}
]
}
%var var2Grouped = var2.value groupBy $.TempId
%function addDesc(id) var2Grouped[var1[id]][0].Desc default {}
---
{
Identifier: payload.'Identifier',
'Type': payload.'Type',
"Codes": payload."Codes" map ((code) -> {
CodeId: code.CodeId,
Code: code.Code ++ addDesc(code.Code.ID)
})
}
我没有能力使用 DW 1.0
但你可以试试这个功能。它将只获取第一个匹配项,但同时将描述设置为 null
如果没有找到匹配的信息。(你也可以使用 filter
函数,而不是 [?(...)]
)
%function getDescription(code) {
Description: var2.value[?(var1[code] ~= $.TempId)][0].Desc default null
}
然后这将是设置结果有效载荷的表达式。
{
Identifier: payload.Identifier,
Type: payload.Type,
Codes: payload.Codes map {
($ mapObject {
(($$): $ ++ getDescription($.ID)) if(($$ as :string) == "Code"),
(($$): $) if (($$ as :string) != "Code")
})
}
}