[英]Nested Elements Mapping XML to JSON in DataWeave
我有如下所示的 XML 结构要转换为 JSON。
<Root>
<PrimeEntity>
<FinEntity>
<RegData>
<CustValue>Test</CustValue>
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest1</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest2</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest3</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity>
</PassInnerEntity>
</PassEntity>
</FinEntity>
</PrimeEntity></Root>
数据应转换为以下 JSON:
"Transactions": [
{
"Id": "Test-DataTest1-DataTest2-DataTest3"
}]
我正在努力解决这个映射,需要一些帮助。
我尝试使用@Jerney 的答案,但我需要更多帮助。
更多信息:我在 Mule 中使用 For-each 处理器来迭代“PrimeEntity”,结果稍后聚合,使用 Inside For-Each 处理器 DWL,它映射到“FinEntity”上,并且需要在这个“ID”细节中。 当我尝试映射“PassEntity”时,我能够获得所需的结果,但我无法连接“CustValue”的值,因为无法在字符串和数组之间使用“++”进行连接。 相同的代码片段是:
($.*PassEntity map
{Description: ($.*PassInnerEntity map {
data: $.Desc
})
})
XML 可能具有重复的复杂元素,例如“FinEntity”和“PassEntity”,而“RegData”只会是一个。 我提供下面的请求xml:
<Root>
<PrimeEntity>
<FinEntity>
<RegData>
Tag does not exists
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest1</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest2</Desc>
</PassInnerEntity>
<PassInnerEntity>
<Desc>DataTest22</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest3</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity></PassInnerEntity>
</PassEntity>
</FinEntity>
<FinEntity>
<RegData>
<CustValue>Test2</CustValue>
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest12</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest22</Desc>
</PassInnerEntity>
<PassInnerEntity>
<Desc>DataTest23</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest24</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity></PassInnerEntity>
</PassEntity>
</FinEntity>
</PrimeEntity>
<PrimeEntity>
<FinEntity>
<RegData>
<CustValue>Test3</CustValue>
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest31</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest32</Desc>
</PassInnerEntity>
<PassInnerEntity>
<Desc>DataTest33</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest34</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity></PassInnerEntity>
</PassEntity>
</FinEntity>
<FinEntity>
<RegData>
<CustValue>Test4</CustValue>
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest41</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest42</Desc>
</PassInnerEntity>
<PassInnerEntity>
<Desc>DataTest43</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest44</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity></PassInnerEntity>
</PassEntity>
</FinEntity>
</PrimeEntity>
</Root>
带有实际和预期详细信息的 JSON 结果:
"Transactions": [
{
"Id": ""
},
{
"Id": "" -- this is coming as null but this is required. Required String
"Test2-DataTest12-DataTest22-DataTest23-DataTest24"
},
{
"Id": "Test3-DataTest31-DataTest32-DataTest33-DataTest34-DataTest41- DataTest42-DataTest43-DataTest44" -- this should be "Test3-DataTest31- DataTest32-DataTest33-DataTest34"
},
{
"Id": "Test4-DataTest31-DataTest32-DataTest33-DataTest34-DataTest41-`DataTest42-DataTest43-DataTest44" -- this should be "Test3-DataTest41-
DataTest42-DataTest43-DataTest44"
}]`
您将需要使用后代选择器..
来获取所有Desc
元素。 这将返回一个数组。 使用joinBy
将其放入您想要的字符串中:
%dw 1.0
%output application/json
%var custValue = payload.Root.PrimeEntity.FinEntity.RegData.CustValue
%var descs = payload..Desc joinBy "-"
---
{
Transactions: [
[
"Id": custValue ++ '-' ++ descs
]
]
}
输出是:
{
"Transactions": [
[
{
"Id": "Test-DataTest1-DataTest2-DataTest3"
}
]
]
}
以下 dataweave 代码应该可以正常工作。
%dw 1.0
%output application/json
---
Transactions : payload.Root.PrimeEntity.*FinEntity map {
Id : ($..CustValue ++ $..Desc) joinBy "-"
}
希望这可以帮助。
我们开始吧,这将产生预期的输出
%dw 2.0
output application/json
---
Transactions :(PrimeEntity : payload.Root.*PrimeEntity map (primeData,indexOfPrimeData) -> {
FinEntity : primeData.*FinEntity map (FinData,indexOfFinData) -> {
idData : (if(typeOf(FinData.RegData) != String){
id : FinData.RegData.CustValue ++ '-' ++ (FinData..Desc joinBy '-')
}
else {
id : ""
})
}
})..idData
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.