Mule Dataweave 用特定值替换空值
Mule Dataweave Replace Null with Specific Value
我的请求负载如下所示:
{
"AllCodes": [
{
"Code1": "ABC"
},
{
"Code2": "TUV"
},
{
"Code3": "XYZ"
}
]
}
我有一个函数可以用某个值替换上面的值。我现在的代码如下:
%dw 1.0
%output application/json
%function LookUp(codes) codes mapObject {($$): $.code} //function to return string values for above codes
%var codeLookup = LookUp(sessionVars.OutputCodes)
%var FinalCodes = payload.AllCodes map codeLookup[$] joinBy ';'
--
FinalCodes
sessionVars.OutputCodes的输出是:
{
"CodeMaster": {
"PrimaryCodes": {
"PrimarySpecCodes": {
"ABC": {
"code": "ABC-String1"
},
"TUV": {
"code": "TUV-String2"
}
}
}
}
}
我期望的输出是:
"ABC-String1;XYZ-String2;XYZ"
正如您在上面看到的,由于该函数仅返回 "ABC" 和 "TUV" 代码的值,如果没有找到函数值,我的最终输出应该是原始值。
我试图在地图运算符之前使用默认值。但是好像不行。
有多种方法可以解决这个问题。一种可能如下:
%dw 1.0
%output application/json
%var payload2= { "CodeMaster": { "PrimaryCodes": { "PrimarySpecCodes": { "ABC": {"code": "ABC-String1"}, "TUV": {"code": "TUV-String2"} } } } }
%var codes = payload2.CodeMaster.PrimaryCodes.PrimarySpecCodes mapObject {
($$) : $.code
}
%var finalCodes = (payload.AllCodes map {
a: $ mapObject {
a1: codes[$] default $
}
}.a.a1) joinBy ";"
---
finalCodes
我们用 $ pluck $
得到 allCodes
的所有值,然后如果没有找到 codes[$]
,我们默认值为 $
。我相信您只需要将 default $
添加到您的原始 dataweave 中即可使其正常工作,但我为 Whosebug 上的其他用户提供了完整的解决方案。
%dw 1.0
%output application/json
%var outputCodes =
{
"CodeMaster": {
"PrimaryCodes": {
"PrimarySpecCodes": {
"ABC": {
"code": "ABC-String1"
},
"TUV": {
"code": "TUV-String2"
}
}
}
}
}
%var allCodes =
{
"AllCodes": [
{
"Code1": "ABC"
},
{
"Code2": "TUV"
},
{
"Code3": "XYZ"
}
]
}
%var codes = outputCodes.CodeMaster.PrimaryCodes.PrimarySpecCodes mapObject {
($$): $.code
}
---
(flatten (allCodes.AllCodes map ($ pluck $))) map (
codes[$] default $
) joinBy ';'
这会产生:
"ABC-String1;TUV-String2;XYZ"
我的请求负载如下所示:
{
"AllCodes": [
{
"Code1": "ABC"
},
{
"Code2": "TUV"
},
{
"Code3": "XYZ"
}
]
}
我有一个函数可以用某个值替换上面的值。我现在的代码如下:
%dw 1.0
%output application/json
%function LookUp(codes) codes mapObject {($$): $.code} //function to return string values for above codes
%var codeLookup = LookUp(sessionVars.OutputCodes)
%var FinalCodes = payload.AllCodes map codeLookup[$] joinBy ';'
--
FinalCodes
sessionVars.OutputCodes的输出是:
{
"CodeMaster": {
"PrimaryCodes": {
"PrimarySpecCodes": {
"ABC": {
"code": "ABC-String1"
},
"TUV": {
"code": "TUV-String2"
}
}
}
}
}
我期望的输出是:
"ABC-String1;XYZ-String2;XYZ"
正如您在上面看到的,由于该函数仅返回 "ABC" 和 "TUV" 代码的值,如果没有找到函数值,我的最终输出应该是原始值。
我试图在地图运算符之前使用默认值。但是好像不行。
有多种方法可以解决这个问题。一种可能如下:
%dw 1.0
%output application/json
%var payload2= { "CodeMaster": { "PrimaryCodes": { "PrimarySpecCodes": { "ABC": {"code": "ABC-String1"}, "TUV": {"code": "TUV-String2"} } } } }
%var codes = payload2.CodeMaster.PrimaryCodes.PrimarySpecCodes mapObject {
($$) : $.code
}
%var finalCodes = (payload.AllCodes map {
a: $ mapObject {
a1: codes[$] default $
}
}.a.a1) joinBy ";"
---
finalCodes
我们用 $ pluck $
得到 allCodes
的所有值,然后如果没有找到 codes[$]
,我们默认值为 $
。我相信您只需要将 default $
添加到您的原始 dataweave 中即可使其正常工作,但我为 Whosebug 上的其他用户提供了完整的解决方案。
%dw 1.0
%output application/json
%var outputCodes =
{
"CodeMaster": {
"PrimaryCodes": {
"PrimarySpecCodes": {
"ABC": {
"code": "ABC-String1"
},
"TUV": {
"code": "TUV-String2"
}
}
}
}
}
%var allCodes =
{
"AllCodes": [
{
"Code1": "ABC"
},
{
"Code2": "TUV"
},
{
"Code3": "XYZ"
}
]
}
%var codes = outputCodes.CodeMaster.PrimaryCodes.PrimarySpecCodes mapObject {
($$): $.code
}
---
(flatten (allCodes.AllCodes map ($ pluck $))) map (
codes[$] default $
) joinBy ';'
这会产生:
"ABC-String1;TUV-String2;XYZ"