[英]Nested Elements Mapping XML to JSON in DataWeave
I have XML Structure as shown below to be transformed to JSON.我有如下所示的 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>
The data should transform to below JSON:数据应转换为以下 JSON:
"Transactions": [
{
"Id": "Test-DataTest1-DataTest2-DataTest3"
}]
I am struggling with this mapping and need some help.我正在努力解决这个映射,需要一些帮助。
I tried working with @Jerney's answer but I need more help.我尝试使用@Jerney 的答案,但我需要更多帮助。
Some more info: I am using For-each processor in Mule to iterate 'PrimeEntity' and the results are aggregated later, Inside For-Each processor DWL is used which maps on 'FinEntity' and inside this "ID" details are needed.更多信息:我在 Mule 中使用 For-each 处理器来迭代“PrimeEntity”,结果稍后聚合,使用 Inside For-Each 处理器 DWL,它映射到“FinEntity”上,并且需要在这个“ID”细节中。 When I try to map 'PassEntity' then I am able to get desired results but i can not concat value of 'CustValue' as concatenation using '++' can not be done between string and array.
当我尝试映射“PassEntity”时,我能够获得所需的结果,但我无法连接“CustValue”的值,因为无法在字符串和数组之间使用“++”进行连接。 the code snippet for the same is:
相同的代码片段是:
($.*PassEntity map
{Description: ($.*PassInnerEntity map {
data: $.Desc
})
})
The XML might have repeating complex elements such as 'FinEntity' and 'PassEntity' whilst 'RegData' will only be one. XML 可能具有重复的复杂元素,例如“FinEntity”和“PassEntity”,而“RegData”只会是一个。 I am providing the request xml below:
我提供下面的请求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>
The JSON Result with actual and expected details:带有实际和预期详细信息的 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"
}]`
You'll want to use the descendents selector ..
to get all the Desc
elements.您将需要使用后代选择器
..
来获取所有Desc
元素。 This will return an array.这将返回一个数组。 Use
joinBy
to get this into the string you'd like:使用
joinBy
将其放入您想要的字符串中:
%dw 1.0
%output application/json
%var custValue = payload.Root.PrimeEntity.FinEntity.RegData.CustValue
%var descs = payload..Desc joinBy "-"
---
{
Transactions: [
[
"Id": custValue ++ '-' ++ descs
]
]
}
Output is:输出是:
{
"Transactions": [
[
{
"Id": "Test-DataTest1-DataTest2-DataTest3"
}
]
]
}
Following dataweave code should work fine.以下 dataweave 代码应该可以正常工作。
%dw 1.0
%output application/json
---
Transactions : payload.Root.PrimeEntity.*FinEntity map {
Id : ($..CustValue ++ $..Desc) joinBy "-"
}
Hope this helps.希望这可以帮助。
Here we go, this is gonna generate the expected output我们开始吧,这将产生预期的输出
%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.