Mule 对象数组到包含所有所述对象的单个对象

Mule 对象数组到包含所有所述对象的单个对象,mule,dataweave,Mule,Dataweave,我正在尝试转换以下输入对象数组: [ { "Id": "3", "Code": "4190484", "Expense": "Huge Expense " }, { "Id": "4", "Code": "271", "Expen

我正在尝试转换以下输入对象数组:

[
 {
    "Id": "3",
    "Code": "4190484",
    "Expense": "Huge Expense "   
 },
 {
    "Id": "4",
    "Code": "271",
    "Expense": "Big Expense"   
 },
 {
    "Id": "3",
    "Code": "433",
    "Expense": "No Expense"   
 } 
]
对于单个对象的此输出:

{
    "Id": "3",
    "Code": "4190484",
    "Expense": "Huge Expense ",
    "Id": "4",
    "Code": "271",
    "Expense": "Big Expense",
    "Id": "3",
    "Code": "433",
    "Expense": "No Expense"
}
在Dataweave中如何实现这一点?

您可以使用reduce()函数,但需要注意的是,在JSON中使用重复键取决于实现。我认为在JSON中使用重复键是一个糟糕的设计。这可能会导致意外的行为。有些实现可能会忽略重复项。例如,DataWeave将只返回结果对象的一个Id,该Id为
payload.Id

即使在我提到的事情之后,你仍然想继续,这是一个例子:

%dw 2.0
output application/json
---
// I don't recommend to use duplicate keys
payload reduce  ((item, acc = {}) -> acc ++ item)
您还可以使用该语言的功能:

%dw 2.0
output application/json
---
{(payload)}

就像@aled在他的回答中解释的那样,您不应该在JSON中使用重复的键。

这很有趣。我知道它是有效的,但我不清楚为什么。它是
{(有效载荷)}
当一个对象在括号之间有一个表达式时,它的意思是括号内表达式的结果将在上面的对象中展开。这是最好的解决方案。我觉得这项功能需要更多的文档来明确它是如何应用于不同的用例的。@aled如果您熟悉的话,它与javascript spread操作符非常相似。但是,是的,我同意——文档中没有很好地介绍这一点,在构建对象/阵列时,它非常有用。我只是想找到一种方法来实现这一点。关于重复关键点的复杂性,这一点很好。谢谢