我有下面的 dataweave 代码(可能不是最好的)来检查数组是否包含任何非数字元素。它还检查数组中的项目数。
%dw 2.0
output json
fun isValidElements(arr: Array) =
arr map ((item) -> item is Number and item != null) reduce ((acc, item) -> acc and item)
fun isValidArray(arr: Array) =
(sizeOf(arr) > 0) and (isEmpty(arr) or isValidElements(arr))
fun flagInvalidArray(arr: Array) = isValidArray(arr)
var MyArray = [123,456,789]
---
{
"arrayValid": flagInvalidArray(MyArray),
"arraySize": if (sizeOf(MyArray) > 1) "Multiple" else "Single"
}
如您所见,这会检查字符串、空值和标志是否有任何数组有效或无效(如果它仅包含数字项,则被认为是有效的)
现在,我需要对字符串数组进行检查。即如果我的输入是这样的
"[123,456,789]"
.
如果我做这样的转换
read(MyArray,"application/json")
,它工作得很好。但是,当我在字符串数组中有任何其他非数字值时,它会失败。我的字符串数组的一些示例:
"[ABC,123,456,789]"
"[123,null,456]"
"[,,,,,%$$$]" -- In cases where there are junk values, we can make the array as empty and flag it as invalid
如果您尝试验证数组的所有元素是否符合条件,则可以使用
every()
模块的 Arrays
函数轻松实现。
我实现这个函数的条件是数组不能为空并且每个元素都是数字。您可以根据需要修改条件。我首先使用 try()/orElse() 将输入字符串读取为 JSON。这只有效,因为 JSON 数字数组与您的输入匹配,但您的输入似乎并不是真正的 JSON。
我添加了一些示例输入来显示结果。
%dw 2.0
output json
import * from dw::core::Arrays
import * from dw::Runtime
fun isValidNumericArray(arr: Array) =
!isEmpty(arr) and (arr every ((item) -> item is Number))
fun isStringNumericArray(s: String) =
try(() -> isValidNumericArray(read(s,"application/json"))) orElse false
---
{
"valid": isStringNumericArray( "[123,456,789]" ),
"emptyArray": isStringNumericArray( "[]" ),
"nullItem": isStringNumericArray( "[123,null,456]" ),
"string": isStringNumericArray( "[ABC,123,456,789]" ),
"junk": isStringNumericArray("[,,,,,%\$]")
}
输出:
{
"valid": true,
"emptyArray": false,
"nullItem": false,
"string": false,
"junk": false
}