mule - 为什么 Mule DataWeave 数组映射会剥离顶级对象?

标签 mule dataweave mulesoft

我试图了解 DataWeave v1.0 在映射根 JSON 数组中的对象时的行为。

在这个阶段,我只想按原样映射数组中的每个项目,而不映射项目的每个单独字段。我需要为数组中的每个项目都这样做,因为稍后我想编辑一些字段,但由于可能有很多我不希望将它们一一映射的开销。

这是我的数据编织:

%dw 1.0
%output application/json
---
payload map {
    ($)
}

这是我的输入:
[
  {
    "MyString": "ABCD",
    "MyNumber": 123,
    "AnObject": {
       "MyBool": false,
       "MyNestedObject": {
            "MyNestedString": "DEF"
       }
    }
  }
]

我希望我的输出(在这个阶段)与我的输入完全相同。

相反,我的( 错误 )输出是:
[
  {
    "MyString": "ABCD",
    "MyNumber": 123,
    "MyBool": false,
    "MyNestedObject": {
      "MyNestedString": "DEF"
    }
  }
]

如您所见,对象 AnObject失踪了,尽管它的 child 仍然存在。

如果输入包含数组,情况会更糟,例如输入:
[
  {
    "MyString": "ABCD",
    "MyNumber": 123,
    "AnObject": {
       "MyBool": false,
       "MyNestedObject": {
            "MyNestedString": "DEF"
       }
    },
    "AnArray": [
        {
            "Title": "An array item",
            "Description": "Pretty standard"
        }
    ]
  }
]

抛出错误:
Cannot coerce a :array to a :object.

我玩过 mapObject也对根数组项进行操作,但我总是遇到相同的行为。有没有人能够解释这里发生的事情,并向我展示如何动态复制根有效负载中的每个项目。

Mule 运行时为 3.9.1。

最佳答案

要遍历数组中的每个项目并让它们保持原样,您应该执行 payload map $ ,与 payload map ((item) -> item) 相同

您所做的与:payload map ((item) -> {(item)}) 相同.

这里您为每个项目返回的是表达式 {(expr)}在 Mule 3.9.1 上运行的 DW 版本中,它有一个意外行为,即表达式试图强制 expr (在这种情况下是一个对象)到对象数组,然后它会尝试将父对象内该强制数组中的所有对象展平。看起来也试图强制键的值,这就是 DW 抛出错误的原因。
{()}的这种行为更新版本的 DW 中的更改。

关于mule - 为什么 Mule DataWeave 数组映射会剥离顶级对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56895421/

相关文章:

mule - 使用数据编织将对象列表转换为 csv

Dataweave 2.0 withMaxSize 函数

java - 了解 Mule ESB 如何适应 JDBC 和 REST

骡子 SFTP : How to create directories on remote location

Dataweave 2.2 takeWhile和filter有什么区别?

xml - 使用 Mule 4 将 CSV 转换为 XML

java - Mule/Groovy - Canonicals 列表拆分为另外 3 个列表

java - 为什么 Ubuntu 环境中的 Mule-ESB 不使用默认的 Java keystore ?

dataweave - 如果从 dataweave 2 mule 中的变量检索值,则 raw 不起作用

arrays - 使用 dataweave 重命名和删除同一数组中的属性