Dataweave 2.0将JSON转换为XML的函数



我正在学习DW2.0,并试图将JSON转换为下面的XML。我尝试使用地图,但不能得到所需的o/p。需要关于解决这个问题的任何功能的建议

JSON:

[{
"id": "M-1",
"type": "Product",
"pricingDetails": [{
"uLow": 2,
"uHigh": 2,
"unitPrice": 0
}]
},
{
"id": "B-2",
"pricingDetails": [{
"uLow": 1000,
"uHigh": 1000,
"unitPrice": 0
},
{
"uLow": 1000,
"uHigh": null,
"unitPrice": 0.56
}
]
}
]

o/p XML:

<ListOfPInfo>
<pInfo>
<pId>M-1</pId>
<uLow> 2</uLow
<uHigh>2</uHigh>
<unitPrice>0<unitPrice>
</pInfo>
<pInfo>
<pId>B-2</pId>
<uLow> 1000</uLow
<uHigh>1000</uHigh>
<unitPrice>0<unitPrice>
</pInfo>
<pInfo>
<pId>B-2</pId>
<uLow> 1000</uLow
<uHigh></uHigh>
<unitPrice>0.56<unitPrice>
</pInfo>
</ListOfPInfo>

您需要在主要项目之后映射定价细节,并将数组转换为对象。一开始可能有点不直观,但我使用reduce()来完成后面的操作。

%dw 2.0
output application/xml
---
{
ListOfPInfo: (payload flatMap ((item, index) -> 
item.pricingDetails 
map {
pInfo: {
pId: item.id,
uLow: $.uLow,
uHigh: $.uHigh,
unitPrice: $.unitPrice
}
} ) 
reduce ((item, accumulator={}) -> accumulator ++ item)
)
}

输出:

<?xml version='1.0' encoding='UTF-8'?>
<ListOfPInfo>
<pInfo>
<pId>M-1</pId>
<uLow>2</uLow>
<uHigh>2</uHigh>
<unitPrice>0</unitPrice>
</pInfo>
<pInfo>
<pId>B-2</pId>
<uLow>1000</uLow>
<uHigh>1000</uHigh>
<unitPrice>0</unitPrice>
</pInfo>
<pInfo>
<pId>B-2</pId>
<uLow>1000</uLow>
<uHigh/>
<unitPrice>0.56</unitPrice>
</pInfo>
</ListOfPInfo>

XML输出是最复杂的输出之一。您需要考虑到,在XML中没有数组,而是具有重复键的对象(JSON不支持)。注意集合的{(...)}包装,它基本上将里面创建的所有对象合并为一个对象。

%dw 2.0
output application/xml
---
{
ListOfPInfo: {(payload flatMap ((item, i1) -> 
item.pricingDetails 
map (pricingDetail, i2) -> {
pInfo: {
pId: item.id,
uLow: pricingDetail.uLow,
uHigh: pricingDetail.uHigh,
unitPrice: pricingDetail.unitPrice
}
}
))}
}

您也可以查看此博客条目https://blogs.mulesoft.com/dev-guides/how-to-tutorials/dataweave-generating-xml/

编辑:谢谢@aled,我错过了价格细节可以包含多个条目,所以我需要用map和flatMap做一个双循环。