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
相关产品推荐
相关产品推荐

