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

为什么Mule DataWeave数组映射剥离顶级对象?,mule,dataweave,mulesoft,Mule,Dataweave,Mulesoft,我试图理解DataWeave v1.0在根JSON数组中映射对象时的行为 在这个阶段,我只想按原样映射数组中的每个项,而不映射该项的每个单独字段。我需要对数组中的每个项都执行此操作,因为稍后我要编辑一些字段,但由于可能有很多字段,我不希望逐个映射它们的开销 这是我的数据编织: %dw 1.0 %output application/json --- payload map { ($) } [ { "MyString": "ABCD", "MyNumber": 123

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

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

这是我的数据编织:

%dw 1.0
%output application/json
---
payload map {
    ($)
}
[
  {
    "MyString": "ABCD",
    "MyNumber": 123,
    "AnObject": {
       "MyBool": false,
       "MyNestedObject": {
            "MyNestedString": "DEF"
       }
    }
  }
]
这是我的输入:

%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"
    }
  }
]
如您所见,对象
缺少一个对象
,尽管其子对象仍然存在

如果输入包含数组,情况会更糟,例如输入:

[
  {
    "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。

要遍历数组中的每个项目并让它们保持原样,您应该执行
负载映射$
,这与
负载映射((项目)->item)

您所做的操作与:
有效负载映射((项)->{(项)})

这里您为每个项目返回的是表达式
{(expr)}
,在Mule 3.9.1上运行的DW版本中,它有一个意外行为,其中表达式试图强制
expr
(在本例中是一个对象)创建一个对象数组,然后它将尝试展平父对象内强制数组中的所有对象。它看起来也试图强制密钥的值,这就是为什么DW抛出错误的原因


{()}
的这种行为在较新版本的DW中发生了变化。

感谢您的回答,Christian,解释得很好。我想我可以从这里解决意外行为。