动态查找后将新项目添加到 JSON 数组
Add new items to JSON array after dynamic lookup
我的示例负载如下。
{
"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
}
]
}
我需要对这 2 个变量进行动态查找,并将新属性添加到主要负载中,如下所示:
{
"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 中的 value 对 var2 中的 TempId 进行查找,并得到 Desc.必须通过与 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")
})
}
}
我的示例负载如下。
{
"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
}
]
}
我需要对这 2 个变量进行动态查找,并将新属性添加到主要负载中,如下所示:
{
"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 中的 value 对 var2 中的 TempId 进行查找,并得到 Desc.必须通过与 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")
})
}
}