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, ...)

参见:

示例:

typeOf(payload.message) ~= "String"