在 DataWeave 中连接两个数组的值
Joining values from two arrays in DataWeave
我刚刚开始使用 Dataweave,并试图弄清楚如何从这个特定的 JSON 响应中转换数据。在相当详尽地阅读文档并搜索示例后,我感到很困惑。找不到任何类似的东西。以下是我正在使用的有效载荷:
[
{
"columnMetadata": [
{
"name": "shape",
"columnIndex": 0,
"dataType": "string",
"schemaType": "Static"
},
{
"name": "color",
"columnIndex": 1,
"dataType": "string",
"schemaType": "Static"
}
],
"rowData": [
[
"square",
"yellow"
],
[
"circle",
"green"
],
[
"star",
"blue"
]
]
}
]
我要实现的转变是这样的:
[
{
"shape": "square",
"color": "yellow"
},
{
"shape": "circle",
"color": "green"
},
{
"shape": "star",
"color": "blue"
}
]
非常感谢任何帮助!
这个转换应该可以得到你的输出
payload..rowData flatMap (v) -> (v map ({shape: $[0], color: $[1]}))
解决此问题的方法是使用 dynamic objects 此功能允许从其他对象动态组合对象或在这种情况下排列对象。类似于js中的展开运算符
%dw 2.0
output application/json
---
payload flatMap ((item, index) -> do {
var metadataNames = item.columnMetadata map ((metadata, index) -> metadata.name)
---
item.rowData map ((datas, index) ->
{
(
datas map ((data, index) ->
{
(metadataNames[index]):data
}
)
)
}
)
})
如果我的理解是正确的,您想按照 columnMetadata 中的信息从 rowData 中选取数据(具体信息将根据 columnIndex 选取,键将基于名称,即形状应来自 rowData[0] 作为columnMetadata.columnIndex 是 0,columnMetada.name 是形状)。这意味着 columnMetadata 中的任何信息都会影响您读取 rowData 的方式。
您可以结合使用 map 和 reduce 来实现此目的。 Reduce 以迭代 columnMetadata 的值并累积结果,并映射以对 rowData 的每个成员执行 reduce。
见下方数据编织:
%dw 2.0
output application/json
---
using (columnMetadata = flatten(payload.columnMetadata))
flatten(payload.rowData) map (row) -> columnMetadata reduce ((item, acc={}) -> acc ++ {(item.name): row[item.columnIndex]})
这将导致:
[
{
"shape": "square",
"color": "yellow"
},
{
"shape": "circle",
"color": "green"
},
{
"shape": "star",
"color": "blue"
}
]
我刚刚开始使用 Dataweave,并试图弄清楚如何从这个特定的 JSON 响应中转换数据。在相当详尽地阅读文档并搜索示例后,我感到很困惑。找不到任何类似的东西。以下是我正在使用的有效载荷:
[
{
"columnMetadata": [
{
"name": "shape",
"columnIndex": 0,
"dataType": "string",
"schemaType": "Static"
},
{
"name": "color",
"columnIndex": 1,
"dataType": "string",
"schemaType": "Static"
}
],
"rowData": [
[
"square",
"yellow"
],
[
"circle",
"green"
],
[
"star",
"blue"
]
]
}
]
我要实现的转变是这样的:
[
{
"shape": "square",
"color": "yellow"
},
{
"shape": "circle",
"color": "green"
},
{
"shape": "star",
"color": "blue"
}
]
非常感谢任何帮助!
这个转换应该可以得到你的输出
payload..rowData flatMap (v) -> (v map ({shape: $[0], color: $[1]}))
解决此问题的方法是使用 dynamic objects 此功能允许从其他对象动态组合对象或在这种情况下排列对象。类似于js中的展开运算符
%dw 2.0
output application/json
---
payload flatMap ((item, index) -> do {
var metadataNames = item.columnMetadata map ((metadata, index) -> metadata.name)
---
item.rowData map ((datas, index) ->
{
(
datas map ((data, index) ->
{
(metadataNames[index]):data
}
)
)
}
)
})
如果我的理解是正确的,您想按照 columnMetadata 中的信息从 rowData 中选取数据(具体信息将根据 columnIndex 选取,键将基于名称,即形状应来自 rowData[0] 作为columnMetadata.columnIndex 是 0,columnMetada.name 是形状)。这意味着 columnMetadata 中的任何信息都会影响您读取 rowData 的方式。
您可以结合使用 map 和 reduce 来实现此目的。 Reduce 以迭代 columnMetadata 的值并累积结果,并映射以对 rowData 的每个成员执行 reduce。
见下方数据编织:
%dw 2.0
output application/json
---
using (columnMetadata = flatten(payload.columnMetadata))
flatten(payload.rowData) map (row) -> columnMetadata reduce ((item, acc={}) -> acc ++ {(item.name): row[item.columnIndex]})
这将导致:
[
{
"shape": "square",
"color": "yellow"
},
{
"shape": "circle",
"color": "green"
},
{
"shape": "star",
"color": "blue"
}
]