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>