我需要检查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
根据变量的值,我需要有不同的String值。上面需要做什么改动才能成功?
我在考虑使用 "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 对象的数组,而不是字符串。
EDIT:
一个更动态的方法是这样的。
%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]
你可以利用字段存在操作符 ?
:
%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.commule-runtime4.3dataweave-flow-control#control_flow_if_else。match
: https:/docs.mulesoft.commule-runtime4.3dataweave-pattern-matching。您还需要注意的是 String
是DW中的一个类型,你必须用引号把它括起来("
或 '
)作为字段名使用。