Mule 4:在 Mule 4 中检查和应用基于有效负载数据类型的条件的最安全方法是什么?
Mule 4 : What is the safest way to check and apply conditions based on data type of payload in Mule 4?
场景:
我有一个有效载荷如下:
{
"message": "Hello world!"
}
Objective : 需要检查“消息”字段的数据类型并对其应用 if else 条件。
尝试的一些方法如下
类型 1:
payload.message is String
类型 2:
typeOf(payload.message) ~= "String"
类型 3:
(typeOf(payload.message) as String) == "String"
在这些方法中,根据有效负载的数据类型检查和应用 if else 条件的最可靠方法是什么?
注意:
类型 2 强制匹配左侧值并检查其是否等于右侧值,因此我确信这不是一个好主意。请问对 1 和 3 有什么想法吗?
如果要检查元素类型,请使用第一种方法:someElement is SomeType
。此表达式 return 是一个布尔值,指示该字段是否为所需类型。使用这种方法编写 if 语句比将 typeOf 函数的结果与字符串进行比较更简洁(尽管两者的工作方式相同)。请注意,如果元素为 null,则表达式的计算结果为 false。
你也可以选择第二个选项。当您使用 typeOf 函数时,它将 return 一个表示元素类型的字符串。请注意,如果该字段为空,则 typeOf 将为 return "Null"。如果要在输出中显示字段类型,可以使用 typeOf。例如:
%dw 2.0
output application/json
---
payload pluck ((value, key, index) ->
{
fieldName: key,
fiedValue: value,
fieldType: typeOf(value)
}
)
使用您提供的输入负载,将导致:
[
{
"fieldName": "message",
"fiedValue": "Hello world!",
"fieldType": "String"
}
]
关于“~=”运算符的一个注意事项:当您想要与不确定其类型的元素进行比较时,通常会使用此运算符。 DataWeave 将尝试将它们强制转换为通用类型并进行实际比较。以下示例说明:
%dw 2.0
output application/json
---
{
comparisonWithoutCoerce: (1 == "1"),
comparisonWithCoerce: (1 ~= "1")
}
将return:
{
"comparisonWithoutCoerce": false,
"comparisonWithtCoerce": true
}
最后,第三种方法可能会给出错误答案:您正在将 payload.message 转换为字符串,然后检查结果是否为字符串。只有当 message 实际上是一个字符串时,这才会给你一个正确的答案。为了向您展示第三种方法行不通,请检查以下情况:
输入负载:
{
"boolValue": true,
"numValue": 12345,
"strValue": "This is a test"
}
使用以下 DataWeave 表达式:
%dw 2.0
output application/json
---
payload pluck ((value, key, index) -> {
fieldName: key,
fiedValue: value,
fieldType: typeOf(value),
fieldType2: typeOf(value as String)
}
)
将导致:
[
{
"fieldName": "boolValue",
"fiedValue": true,
"fieldType": "Boolean",
"fieldType2": "String"
},
{
"fieldName": "numValue",
"fiedValue": 12345,
"fieldType": "Number",
"fieldType2": "String"
},
{
"fieldName": "strValue",
"fiedValue": "This is a test",
"fieldType": "String",
"fieldType2": "String"
}
]
此外,如果某些字段是数组,Dataweave 表达式将失败,因为它无法将数组强制转换为字符串。
为简单起见,您可以只使用 typeOf(value)
并使用强制 (ie: String, Array, Number, Boolean, Object, Null, DateTime, ...
)
参见:
- https://docs.mulesoft.com/mule-runtime/4.3/dw-core-functions-typeof
- https://docs.mulesoft.com/mule-runtime/4.3/dataweave-types-coercion#type-coercion-table
- https://docs.mulesoft.com/mule-runtime/4.3/dw-operators#equality-and-relational-operators
示例:
typeOf(payload.message) ~= "String"
场景: 我有一个有效载荷如下:
{
"message": "Hello world!"
}
Objective : 需要检查“消息”字段的数据类型并对其应用 if else 条件。
尝试的一些方法如下 类型 1:
payload.message is String
类型 2:
typeOf(payload.message) ~= "String"
类型 3:
(typeOf(payload.message) as String) == "String"
在这些方法中,根据有效负载的数据类型检查和应用 if else 条件的最可靠方法是什么?
注意: 类型 2 强制匹配左侧值并检查其是否等于右侧值,因此我确信这不是一个好主意。请问对 1 和 3 有什么想法吗?
如果要检查元素类型,请使用第一种方法:someElement is SomeType
。此表达式 return 是一个布尔值,指示该字段是否为所需类型。使用这种方法编写 if 语句比将 typeOf 函数的结果与字符串进行比较更简洁(尽管两者的工作方式相同)。请注意,如果元素为 null,则表达式的计算结果为 false。
你也可以选择第二个选项。当您使用 typeOf 函数时,它将 return 一个表示元素类型的字符串。请注意,如果该字段为空,则 typeOf 将为 return "Null"。如果要在输出中显示字段类型,可以使用 typeOf。例如:
%dw 2.0
output application/json
---
payload pluck ((value, key, index) ->
{
fieldName: key,
fiedValue: value,
fieldType: typeOf(value)
}
)
使用您提供的输入负载,将导致:
[
{
"fieldName": "message",
"fiedValue": "Hello world!",
"fieldType": "String"
}
]
关于“~=”运算符的一个注意事项:当您想要与不确定其类型的元素进行比较时,通常会使用此运算符。 DataWeave 将尝试将它们强制转换为通用类型并进行实际比较。以下示例说明:
%dw 2.0
output application/json
---
{
comparisonWithoutCoerce: (1 == "1"),
comparisonWithCoerce: (1 ~= "1")
}
将return:
{
"comparisonWithoutCoerce": false,
"comparisonWithtCoerce": true
}
最后,第三种方法可能会给出错误答案:您正在将 payload.message 转换为字符串,然后检查结果是否为字符串。只有当 message 实际上是一个字符串时,这才会给你一个正确的答案。为了向您展示第三种方法行不通,请检查以下情况:
输入负载:
{
"boolValue": true,
"numValue": 12345,
"strValue": "This is a test"
}
使用以下 DataWeave 表达式:
%dw 2.0
output application/json
---
payload pluck ((value, key, index) -> {
fieldName: key,
fiedValue: value,
fieldType: typeOf(value),
fieldType2: typeOf(value as String)
}
)
将导致:
[
{
"fieldName": "boolValue",
"fiedValue": true,
"fieldType": "Boolean",
"fieldType2": "String"
},
{
"fieldName": "numValue",
"fiedValue": 12345,
"fieldType": "Number",
"fieldType2": "String"
},
{
"fieldName": "strValue",
"fiedValue": "This is a test",
"fieldType": "String",
"fieldType2": "String"
}
]
此外,如果某些字段是数组,Dataweave 表达式将失败,因为它无法将数组强制转换为字符串。
为简单起见,您可以只使用 typeOf(value)
并使用强制 (ie: String, Array, Number, Boolean, Object, Null, DateTime, ...
)
参见:
- https://docs.mulesoft.com/mule-runtime/4.3/dw-core-functions-typeof
- https://docs.mulesoft.com/mule-runtime/4.3/dataweave-types-coercion#type-coercion-table
- https://docs.mulesoft.com/mule-runtime/4.3/dw-operators#equality-and-relational-operators
示例:
typeOf(payload.message) ~= "String"