Dataweave 2.0 - XML到JSON数组:在不同的XML结构中按id分组



我正在尝试从数据结构a实现数据结构B。

不知道如何遍历XML结构,然后按并提取根元素,即作为"type"one_answers"message">

任何帮助/建议都是非常感谢的。

注意:空元素应该是

感谢结构:

<root>
<TYPE_A>
<row id="0">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>123</ORDER_NUMBER>
</row>
</TYPE_A>
<TYPE_B/>
<TYPE_C>
<row id="0">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>123</ORDER_NUMBER>
</row>
<row id="1">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>789</ORDER_NUMBER>
</row>
<row id="2">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>555</ORDER_NUMBER>
</row>
</TYPE_C>
<TYPE_D>
<row id="0">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>555</ORDER_NUMBER>
</row>
<row id="1">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>123</ORDER_NUMBER>
</row>
<row id="2">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>789</ORDER_NUMBER>
</row>
</TYPE_D>
</root>

结构B:

[  
{
"orderNumber": "123",
"type": "A",
"message": "Unique Message"
},
{
"orderNumber": "123",
"type": "C",
"message": "Unique Message"
},
{
"orderNumber": "789",
"type": "C",
"message": "Unique Message"
},
{
"orderNumber": "555",
"type": "C",
"message": "Unique Message"
},
{
"orderNumber": "555",
"type": "D",
"message": "Unique Message"
},
{
"orderNumber": "123",
"type": "D",
"message": "Unique Message"
},
{
"orderNumber": "789",
"type": "D",
"message": "Unique Message"
}
]

这是一个动态的解决方案。首先过滤掉空对象(本例中是TYPE_B),获取根对象的键并通过它们进行映射。对于每种类型,获取valuesOfrootData中对应的对象,这将返回这些对象的数组。最后映射到该集合并执行转换。

%dw 2.0
output application/json
var rootData = payload.root filterObject not isEmpty($)
---
keysOf(rootData) flatMap ((messageType, index) -> 
valuesOf(rootData[messageType]) map ((order) -> 
{
orderNumber: order."ORDER_NUMBER",
"type": upper(messageType[-1]),
message: order."MESSAGE"
}
)      
)

这是另一个"动态";解决方案,选择一个表现最好的并使用它:

%dw 2.0
output application/json
var xml = '<root>
<TYPE_A>
<row id="0">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>123</ORDER_NUMBER>
</row>
</TYPE_A>
<EMPTY_TYPE_B/>
<TYPE_C>
<row id="0">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>123</ORDER_NUMBER>
</row>
<row id="1">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>789</ORDER_NUMBER>
</row>
<row id="2">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>555</ORDER_NUMBER>
</row>
</TYPE_C>
<TYPE_D>
<row id="0">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>555</ORDER_NUMBER>
</row>
<row id="1">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>123</ORDER_NUMBER>
</row>
<row id="2">
<MESSAGE>Unique Message</MESSAGE>
<ORDER_NUMBER>789</ORDER_NUMBER>
</row>
</TYPE_D>
</root>'
var data = read(xml,"application/xml")
---
orders: data.root filterObject (not isEmpty($)) 
mapObject do {
var tp = ($$ as String splitBy "_")[-1]
var rs = $.*row
---
(tp): rs map (r) -> {
orderNumber: r.ORDER_NUMBER,
"type": tp,
message: r.MESSAGE
}
}
pluck $
reduce (e,acc=[]) -> acc ++ e

此解决方案适用于您,但前提是您知道所有类型

%dw 2.0
output application/json
---
orders: (if (payload.root.TYPE_A != null) 
(payload.root.*TYPE_A map (object, index) -> {
orderNumber: object.row.ORDER_NUMBER,
"type": "A",
message: object.row.MESSAGE
}) else ([])) ++
(if (payload.root.TYPE_B != null) 
(payload.root.*TYPE_B map (objectB, indexB) -> {
orderNumber: objectB.row.ORDER_NUMBER,
"type": "B",
message: objectB.row.MESSAGE
}
) else ([])) ++
(if (payload.root.TYPE_C != null) 
(payload.root.*TYPE_C map (objectC, indexC) -> {
orderNumber: objectC.row.ORDER_NUMBER,
"type": "C",
message: objectC.row.MESSAGE
}
) else ([]))

这是另一个动态解决方案

%dw 2.0
output application/json skipNullOn="everywhere"
fun mapRows(key, rows) =
rows map
{
"type": key[-1],
"orderNumber":$.ORDER_NUMBER,
"message": $.MESSAGE
}
---
flatten(payload.root pluck mapRows($$, $.*row))

最新更新