我试图了解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。
答案 0 :(得分:1)
要遍历数组中的每个项目并按原样进行操作,您应该执行payload map $
,与payload map ((item) -> item)
相同
您所做的与payload map ((item) -> {(item)})
相同。
在这里,您返回的每一项都是表达式{(expr)}
,在运行于Mule 3.9.1的DW版本中,它具有偶然的行为,其中该表达式试图强制expr
(在这种情况下是一个对象)到对象数组,然后它将尝试将父对象内该强制数组中的所有对象展平。看起来似乎也在尝试强制更改键的值,这就是DW引发错误的原因。
{()}
的这种行为在较新版本的DW中发生了变化。