JSON 对象中的密钥存在(Mule 4)



我需要检查JSON对象中是否存在特定关键字,并在此基础上创建一个字符串。我的示例 dataweave 2.0 代码如下所示:

%dw 2.0
output application/json
var arr = {
"ID": "100",
"ProdId": "Prod",
"ProdName": "ABC"
}
---
if (arr pluck $$ joinBy ';' contains "ProdId") == true
then (String: "Product") else
if (arr pluck $$ joinBy ';' contains "EmpId") == true
then (String: "Employee") else null

根据变量的值,我需要有不同的字符串值。上面需要什么改变才能工作?

您可以利用字段存在运算符?

%dw 2.0
output application/json
var o = {
"ID": "100",
"ProdId": "Prod",
"ProdName": "ABC"
}
---
if (o.ProdId?) (String: "Product") else 
if (o.EmpId?) (String: "Employee") else null

您还可以使用match运算符来解决模式匹配问题:

%dw 2.0
output application/json
var o = {
"ID": "100",
"ProdId": "Prod",
"ProdName": "ABC"
}
---
"ProdId" match {
case "ProdId" -> "String": "Product"
case "EmpId"  -> "String": "Employee"
else -> null
}

以下是文档:

  • if: https://docs.mulesoft.com/mule-runtime/4.3/dataweave-flow-control#control_flow_if_else
  • match: https://docs.mulesoft.com/mule-runtime/4.3/dataweave-pattern-matching

您还需要注意String是DW中的类型,则必须将其括在引号("'(中以用作字段名称。

我正在考虑使用"keysOf"函数(以前是Object::keySet(和类似的东西:

%dw 2.0
output application/json
var arr = {
"ID": "100",
"ProdId": "Prod",
"ProdName": "ABC"
}
---
if (keysOf(arr) contains("ProdId" as Key)) "Product"
else if (keysOf(arr) contains("EmpId" as Key)) "Employee"
else "Not Recognized"

请注意,"keysOf" 返回一个 Key 对象数组,而不是 Strings。

编辑:

一个更动态的方法可以是这样的:

%dw 2.0
output application/json
import firstWith from dw::core::Arrays
var arr = {
"ID": "100",
"ProdId": "Prod",
"ProdName": "ABC"
}
var myTypes = {
ProdId: "Product",
EmpId: "Employee"
}
var typeId = (keysOf(myTypes) firstWith (keysOf(arr) contains $)) as String
---
myTypes[typeId]

最新更新