我有一个要求,我需要将字符串转换为数组或对象(如果有效负载中存在),否则将值返回为字符串或布尔值。
Input-
{
"Id": {
"EmpId": 1
},
"employee": [
{
"Headers": 1234,
"Present": true,
"UseBa": null,
"EmployeeNames": "[\n 'abc'\n]",
"ClientID": "31d00",
"types": "{\n type: 'hello',\n scope: 'world'\n}",
"Request": false
},
{
"Headers": 2345,
"Present": true,
"UseBa": null,
"EmployeeNames": "[\n 'xyz'\n]",
"ClientID": "31d00",
"types": "{\n type: 'hello',\n scope: 'world'\n}",
"Request": false
}
]
}
I want to achieve the above output how to read and replace it.. I tried multiple things but it is not working, Please help me on this.
I tried logic-
%dw 2.0
output application/json
var items = payload mapObject ((value, key, index) ->
(key):
if (typeOf(value) == String)
(if (((value contains ("[\n")) or (value contains ("["))) and ((value contains ("\n]")) or (value contains ("["))))
(read(value))
else
(value))
else
(value)
)
---
{
"Id": {
"EmpId": payload.Id.EmpId default null
},
"results": items
}
Above logic is not working.. please help where am going wrong
期待输出-
{ “ID”: { “EmpId”:1 }, “员工”: [ { “标题”:1234, “现在”:真实, “UseBa”:空 “员工姓名”:[ “abc” ], “客户端ID”:“31d00”, “类型”:{ “类型”:“你好”, “范围”:“世界” }, “请求”:假 }, { “标题”:2345, “现在”:真实, “UseBa”:空 “员工姓名”:[ “xyz”, “123” ], “客户端ID”:“31d00”, “类型”:{ “类型”:“你好”, “范围”:“世界” }, “请求”:假 } ] }
那是因为这些字符串包含看起来类似于 JSON 的内容,但它不是 DataWeave 中支持的格式,即使在考虑转义之后也是如此。因此,DataWeave 无法将这些字符串解析为对象。
如果您可以更改输入的生成方式,请确保这些字符串是转义 JSON,以便它们与 DataWeave 兼容。
转义 JSON 字符串示例:
"EmployeeNames": "[\n \"abc\"\n]",
...
"types": "{\n \"type\": \"hello\",\n \"scope\": \"world\"\n}",
一旦解决了兼容性问题,就可以使用递归函数来完成转换,该函数根据数据类型执行转换。与使用 ifs 相比,更优雅的做法是尝试使用运行时模块中的
try()
函数是否可以将字符串读取为 JSON。 if 更容易出错,因为可能无法保证这些字符之一将包含在字符串中,但整个字符串可能无法解析,并且您的版本中没有错误处理。使用 try()
可以防止解析失败而破坏脚本。它并不完美,但可以更好地处理错误。除了对象和字符串之外,脚本还需要考虑数组,将递归应用于其中的每个元素。
%dw 2.0
output application/json
import * from dw::Runtime
fun stringsToObjects(x)=
x match {
case o is Object -> o mapObject ((value, key, index) -> (key): stringsToObjects(value))
case a is Array -> a map stringsToObjects($)
case s is String ->
try(() ->
read(s,"application/json")) orElse s
else -> x
}
---
stringsToObjects(payload)
请记住,在未指定格式类型作为第二个参数的情况下,切勿使用
read()
。默认情况下,它将使用 application/dw
,它仅用于调试,不应在生产应用程序中使用。