Dataweave 2.0 函数将 JSON 转换为 XML
Dataweave 2.0 Functions to transform a JSON to XML
刚开始学习DW2.0,想把下面的JSON改成XML。我尝试使用 Map 但无法获得所需的 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>
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 进行双循环。
您需要将定价明细映射到主要项目之后,并将数组转换为对象。一开始可能有点不直观,但我使用 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>
刚开始学习DW2.0,想把下面的JSON改成XML。我尝试使用 Map 但无法获得所需的 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>
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 进行双循环。
您需要将定价明细映射到主要项目之后,并将数组转换为对象。一开始可能有点不直观,但我使用 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>