将DataWeave中两个数组中的值连接起来

问题描述

我刚开始使用Dataweave并试图弄清楚如何从这个特定的JSON响应转换数据。在相当详尽地阅读文档并搜索示例之后,我感到很沮丧。找不到喜欢的东西。以下是我正在使用的有效负载

[
  {
    "columnMetadata": [
      {
        "name": "shape","columnIndex": 0,"dataType": "string","schemaType": "Static"
      },{
        "name": "color","columnIndex": 1,"schemaType": "Static"
      }
    ],"rowData": [
      [
        "square","yellow"
      ],[
        "circle","green"
      ],[
        "star","blue"
      ]
    ]
  }
]

我要实现的转型是这样的:

[
    {
        "shape": "square","color": "yellow"
    },{
        "shape": "circle","color": "green"
    },{
        "shape": "star","color": "blue"
    }
]

任何帮助,不胜感激!

解决方法

解决此问题的方法是使用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
                    }
                )
            )
        }
    )
})
,

此转换应该可以获取您的输出

payload..rowData flatMap (v) -> (v map ({shape: $[0],color: $[1]}))
,

如果我的理解是正确的,那么您希望按照columnMetadata中找到的信息从rowData中选择数据(特定信息将基于columnIndex进行选择,键将基于名称,即形状应来自rowData [0]作为columnMetadata。 columnIndex为0,columnMetada.name为shape)。这意味着columnMetadata中的任何信息都会影响您读取rowData的方式。

您可以使用map和reduce的组合来实现。减少以迭代columnMetadata的值并累积结果,然后映射以对rowData的每个成员执行减少操作。

请参见下面的数据编织:

%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"
  }
]