如何在MuleSoft DataWeave 2.0中提取并清理CSV字段内的JSON负载
解决Mule 4中解析CSV字段内转义JSON并清理HTML的问题
核心问题分析
报错根源是CSV里的errorResponsePayload字段为转义后的JSON字符串(比如用\"转义双引号),直接调用read()解析时,转义字符会导致JSON格式校验失败。同时需要处理HTML标签和换行符,需通过字符串替换完成清理。
分步解决方案与完整脚本
1. 提取并解析multipart中的CSV
先从multipart负载里取出CSV文件内容,转换为字符串后解析成CSV对象数组。
2. 处理转义JSON字段
先移除JSON字符串中的转义符,再解析为JSON对象;加入容错逻辑避免单个字段解析失败导致整个脚本报错。
3. 清理HTML与换行符
用正则表达式匹配并替换所有HTML标签和换行符。
完整DataWeave脚本:
%dw 2.0 output application/json import * from dw::Runtime import unescapeJava from dw::core::Strings // 从multipart中提取CSV内容(假设第一个part是目标CSV) var csvContent = payload.parts[0].content as String // 解析CSV为对象数组 var parsedCsv = read(csvContent, "application/csv", {header: true}) --- parsedCsv map (row) -> { // 保留CSV中除errorResponsePayload外的所有字段 (row - "errorResponsePayload"), errorResponsePayload: do { // 第一步:处理Java风格转义(包括\"、\\n等) var unescapedStr = unescapeJava(row.errorResponsePayload) // 第二步:清理HTML标签和换行符 var cleanedStr = unescapedStr replace /<[^>]+>/g with "" replace /\r?\n/g with " " // 第三步:解析为JSON,添加容错逻辑 --- try(() -> read(cleanedStr, "application/json")) orElse { rawContent: cleanedStr, parseError: "JSON解析失败" } } }
关键细节说明
- 转义处理:用
unescapeJava()可以一次性处理所有Java风格的转义字符(比如\"转成"、\\n转成\n),比单独替换更通用。 - HTML清理:正则
<[^>]+>匹配所有HTML标签,\r?\n兼容Windows和Unix的换行格式,替换为空格保证文本连贯性。 - 容错机制:
try()包裹解析逻辑,当JSON格式异常时,会返回原始清理后的字符串和错误信息,避免整个流程中断。
输入输出示例
输入CSV片段
requestId,errorResponsePayload REQ001,"{\"msg\":\"<div>提交失败<br>请检查参数</div>\",\"status\":400}" REQ002,"{\"msg\":\"系统升级中\\n暂停服务\",\"status\":503}"
输出JSON
[ { "requestId": "REQ001", "errorResponsePayload": { "msg": "提交失败 请检查参数", "status": 400 } }, { "requestId": "REQ002", "errorResponsePayload": { "msg": "系统升级中 暂停服务", "status": 503 } } ]
常见排查点
如果仍出现解析错误,检查:
- 确认CSV字段的转义规则:如果是CSV标准的双引号转义(用
""表示单个"),需在解析CSV时开启escape: "\""配置。 - 验证
payload.parts[0].content是否确实是CSV字符串,必要时添加as String强制转换。 - 若JSON中包含特殊字符,可在清理阶段额外添加正则处理(比如替换制表符
\t)。
内容的提问来源于stack exchange,提问作者Sunny85
相关产品推荐
相关产品推荐

