DataWeave 中的嵌套元素映射 XML 到 JSON
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
元素。这将 return 一个数组。使用 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"
}
]
]
}
以下数据编织代码应该可以正常工作。
%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
我有如下所示的 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
元素。这将 return 一个数组。使用 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"
}
]
]
}
以下数据编织代码应该可以正常工作。
%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