You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

CSV转嵌套JSON的DataWeave实现

需求

我正在推进一个项目,需要将包含人员及其关联产品信息的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
    }
  ]
}

我的尝试脚本

%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

问题说明与修正

首先要指出:你给出的期望JSON存在语法错误——JSON对象不允许重复定义相同的键(比如重复的Dan、FirstName),这种结构在实际中是无效的。

你编写的脚本其实已经实现了正确的数据聚合逻辑,它会生成一个以Dan字段值为键的对象,每个键对应一个完整的人员信息(包含产品数组),输出示例如下:

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

如果想要得到人员对象数组的格式(更符合常见的API输出规范),可以修改脚本,将mapObject替换为map,去掉键映射的逻辑:

%dw 2.0
output application/json

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

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

---
groupedData

修改后的输出为:

[
  {
    "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
      }
    ]
  }
]

内容的提问来源于stack exchange,提问作者denis krizanovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:25:11