如何用DataWeave将嵌套JSON转换为无转义符的CSV格式
嵌套JSON转扁平化CSV的正确实现
输入JSON结构
[{ "ID": "123456", "accountNumber": "876545", "contractType": "ABCD", "linedata": { "productSKU": "1234", "data": { "Line_Number": 1726428, "Reservation_Number": "1726428", "Quantity": 1, "UnitPrice": 16 } } }, { "ID": "345678", "accountNumber": "445566", "contractType": "ABCD", "linedata": { "productSKU": "2345", "data": { "Line_Number": 3213445565, "Reservation_Number": "123456789", "Quantity": 1, "UnitPrice": 25 } } }]
目标CSV格式
Data, ID, AccountNumber, Contract_Type {"productSKU":"1234","data":{"Line_Number":1726428, "Reservation_Number":"1726428", "Quantity":1, "UnitPrice":16}}, 123456, 876545, ABCD {"productSKU":"2345","data":{"Line_Number":3213445565,"Reservation_Number":"123456789","Quantity":1,"UnitPrice":25}}, 345678, 445566, ABCD
遇到的问题
- 用
write(item.linedata, "application/json")将linedata转为JSON字符串时,输出会多出不必要的反斜杠,导致Data字段内容不符合预期。 - 手动拼接字符串移除反斜杠后,CSV解析器会把Data字段内的逗号当成列分隔符,直接拆成多列,同时字段内的双引号未正确转义,导致整个CSV格式混乱。
正确的DataWeave代码实现
%dw 2.0 output application/csv header=true quoteValues=true escape="\"" --- inputJSON map ((item) -> { Data: write(item.linedata, "application/json") replace /\\/ with "", ID: item.ID, AccountNumber: item.accountNumber, Contract_Type: item.contractType })
代码说明
output application/csv header=true:直接指定输出为CSV格式并自动生成表头,无需先转JSON再二次处理。quoteValues=true:让CSV自动为包含逗号、双引号的字段添加外层引号,避免Data字段内的逗号被误判为列分隔符。escape="\"":按照CSV标准规则,将字段内部的双引号转义为两个连续双引号,保证解析时不会出现格式错误。replace /\\/ with "":移除write函数生成的JSON字符串中的反斜杠,得到干净的原生JSON内容。
最终输出的合规CSV
Data,ID,AccountNumber,Contract_Type "{`"productSKU`":`"1234`",`"data`":{`"Line_Number`":1726428,`"Reservation_Number`":`"1726428`",`"Quantity`":1,`"UnitPrice`":16}}","123456","876545","ABCD" "{`"productSKU`":`"2345`",`"data`":{`"Line_Number`":3213445565,`"Reservation_Number`":`"123456789`",`"Quantity`":1,`"UnitPrice`":25}}","345678","445566","ABCD"
(注:实际输出中内部双引号会被转义为两个连续双引号,符合CSV规范,解析工具可正确识别为单个完整的JSON字符串字段)
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

