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

DataWeave实现CSV转JSON:如何合并映射结果为单个对象

解决DataWeave将CSV转JSON时合并单键对象为单个对象的问题

问题描述

现有DataWeave脚本通过外部字段映射将CSV转换为JSON,但当前输出每行对应多个单键值对对象的数组,期望每行输出一个包含所有键值对的对象。

原脚本生成的错误输出:

[
  [
    {"FirstName": "Jane"},
    {"LastName": " Austin"},
    {"Title": " CEO"},
    {"Height__c": "7"},
    {"Priority__c": null},
    {"Hobbies__c": null}
  ],
  [
    {"FirstName": "Bob"},
    {"LastName": " Smith"},
    {"Title": " COO"},
    {"Height__c": " 6"},
    {"Priority__c": null},
    {"Hobbies__c": null}
  ]
]

期望的正确输出:

[
    {
      "FirstName": "Jane",
      "LastName": " Austin",
      "Title": " CEO",
      "Height__c": "7",
      "Priority__c": null,
      "Hobbies__c": null
    },
    {
      "FirstName": "Bob",
      "LastName": " Smith",
      "Title": " COO",
      "Height__c": " 6",
      "Priority__c": null,
      "Hobbies__c": null
    }
]

问题根源

原脚本中,fieldMappings map (...)会返回由多个单键对象组成的数组,而非单个整合后的对象,导致每行结果是对象数组而非单个对象。

解决方法

方法1:使用reduce合并对象数组

将reduce操作放在每行数据的处理逻辑内部,把单键对象数组合并为单个对象:

%dw 2.0
input csvData application/csv
input fieldMappings application/json
input objectProperties application/json
var apexClass = objectProperties.ObjectName

output application/json
---
csvData map ((row) -> 
    // 先生成单键对象数组
    fieldMappings map (fieldMapping) -> 
        (fieldMapping.target): if(row[fieldMapping.source] != "") row[fieldMapping.source] else fieldMapping."defaultValue"
    // 用reduce合并数组中的所有对象
    reduce ((item, accumulator = {}) -> accumulator ++ item)
)

方法2:使用mapObject直接构建目标对象

更简洁的方式是用mapObject直接遍历字段映射,一次性构建包含所有键值对的对象:

%dw 2.0
input csvData application/csv
input fieldMappings application/json
input objectProperties application/json
var apexClass = objectProperties.ObjectName

output application/json
---
csvData map ((row) -> 
    fieldMappings mapObject ((fieldMapping) -> 
        (fieldMapping.target): if(row[fieldMapping.source] != "") row[fieldMapping.source] else fieldMapping."defaultValue"
    )
)

错误原因说明

你之前尝试的reduce位置错误,将其放在了csvData map的外部,导致处理逻辑作用于整个CSV行数组而非每行内部的单键对象数组,因此出现类型转换错误。正确的做法是将reduce(或mapObject)放在每行数据的处理范围内,针对当前行的字段映射结果进行合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:13:15