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