如何在 mule 4 中将字符串转换为数组和对象

问题描述 投票:0回答:1

我有一个要求,我需要将字符串转换为数组或对象(如果有效负载中存在),否则将值返回为字符串或布尔值。

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”, “类型”:{ “类型”:“你好”, “范围”:“世界” }, “请求”:假 } ] }

replace dataweave mule-studio mulesoft anypoint-studio
1个回答
0
投票

那是因为这些字符串包含看起来类似于 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
,它仅用于调试,不应在生产应用程序中使用。

© www.soinside.com 2019 - 2024. All rights reserved.