如何在DataWeave中将CSV转换为嵌套的JSON结构?

问题描述 投票:0回答:2

我正在开发一个项目,需要将 CSV 数据转换为特定的 JSON 格式。 CSV 包含有关人员及其相关产品的信息,我想将这些数据聚合到一个嵌套的 JSON 结构中,其中每个人都是一个对象,包含其详细信息和产品数组

输入的 CSV 为:

Dan,FirstName,LastName,DateofBirth,ProductName,ProductValue
q,denis,Kriz,01/01/1980,sales cloud,1000
q,denis,kriz,01/01/1980,service cloud,2000
x,lucas,kriz,01/01/2010,marketing cloud,3000

所需的 JSON 输出:

{
  "Dan": "q",
  "FirstName": "denis",
  "LastName": "kriz",
  "DateOfBirth": "01/01/1980",
  "Products": [
    {
      "productName": "sales cloud", 
      "productValue": 1000
    },
    {
      "productName": "service cloud",
      "productValue": 2000
    }
  ],
  "Dan": "x",
  "FirstName": "lucas",
  "LastName": "kriz",
  "DateOfBirth": "01/01/2010",
  "Products": [
    {
      "productName": "marketing cloud",
      "productValue": 3000
    }
  ]
}

这是我尝试使用 DataWeave 的脚本:

%dw 2.0
output application/json

var data = payload
var header = data[0]
var rows = data[1 to -1]

var includedFields = ["ProductName", "ProductValue"]

var groupedData = rows groupBy ($.Dan) mapObject ((value, key, index) -> {
    Dan: key,
    FirstName: value[0].FirstName,
    LastName: value[0].LastName,
    DateOfBirth: value[0].DateofBirth,
    Products: value map ((item, index) -> {
        productName: (item.ProductName as String),
        productValue: (item.ProductValue as Number)
    })
})

---
groupedData
dataweave
2个回答
1
投票

如果您正在寻找以下 JSON 作为所需的输出

[
  {
    "Dan": "q",
    "FirstName": "denis",
    "LastName": "kriz",
    "DateOfBirth": "01/01/1980",
    "Products": [
      {
        "productName": "sales cloud",
        "productValue": 1000
      },
      {
        "productName": "service cloud",
        "productValue": 2000
      }
    ]
  },
  {
    "Dan": "x",
    "FirstName": "lucas",
    "LastName": "kriz",
    "DateOfBirth": "01/01/2010",
    "Products": [
      {
        "productName": "marketing cloud",
        "productValue": 3000
      }
    ]
  }
]

你可以使用这个脚本:

%dw 2.0
output application/json
import * from dw::core::Strings
var groupedData = payload groupBy (item) -> 
    item.Dan ++ '|' ++ item.FirstName  ++ '|' ++ item.LastName ++ '|' ++ item.DateofBirth
---
valuesOf(groupedData) map ((group, index) -> {
    Dan: group[0].Dan,
    FirstName: group[0].FirstName,
    LastName: group[0].LastName,
    DateOfBirth: group[0].DateofBirth,
    Products: group map (product) -> {
        productName: product.ProductName,
        productValue: (product.ProductValue as Number)
    }
})


0
投票

我会推荐@AnuragSharma 解决方案,因为输出更清晰。但是,如果您确实需要重复的密钥,您可以使用此脚本:

%dw 2.0
output application/json
---
payload 
    groupBy ($.Dan) 
    mapObject ((value, key) -> {
        Dan: key,
        FirstName: value[0].FirstName,
        LastName: value[0].LastName,
        DateOfBirth: value[0].DateofBirth,
        Products: value map ((item, index) -> {
            productName: (item.ProductName as String),
            productValue: (item.ProductValue as Number)
        })
    })

输出:

{
  "Dan": "q",
  "FirstName": "denis",
  "LastName": "Kriz",
  "DateOfBirth": "01/01/1980",
  "Products": [
    {
      "productName": "sales cloud",
      "productValue": 1000
    },
    {
      "productName": "service cloud",
      "productValue": 2000
    }
  ],
  "Dan": "x",
  "FirstName": "lucas",
  "LastName": "kriz",
  "DateOfBirth": "01/01/2010",
  "Products": [
    {
      "productName": "marketing cloud",
      "productValue": 3000
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.