为什么Mule DataWeave阵列贴图会剥离顶级对象?

时间:2019-07-05 00:58:12

标签: mule dataweave mulesoft

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

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

这是我的数据结构:

%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丢失了,尽管它的子对象仍然存在。

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

[
  {
    "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操作,但是我总是遇到相同的行为。有谁能解释这里发生的事情,并告诉我如何动态复制根有效负载中的每个项目。

M子运行时为3.9.1。

1 个答案:

答案 0 :(得分:1)

要遍历数组中的每个项目并按原样进行操作,您应该执行payload map $,与payload map ((item) -> item)相同

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

在这里,您返回的每一项都是表达式{(expr)},在运行于Mule 3.9.1的DW版本中,它具有偶然的行为,其中该表达式试图强制expr(在这种情况下是一个对象)到对象数组,然后它将尝试将父对象内该强制数组中的所有对象展平。看起来似乎也在尝试强制更改键的值,这就是DW引发错误的原因。

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