如何使用DataWeave将字符串中转义的JSON数组转为实际数组
DataWeave 转义JSON字符串转标准JSON数组实现方案
问题场景
输入JSON中部分字段值为转义后的JSON字符串,双引号前带\转义符,整体为字符串类型,无法直接按JSON结构读取内部字段,需要将这类字符串转换为原生JSON数组/对象结构。
本次使用的测试输入数据如下:
{ "values": [ { "start": "{\"value\":[{\"classifier\":\"data1\",\"params\":\"1234\",\"year\":\"1930\",\"month\":null,\"day\":null,\"source\":null}],\"primary\":true,\"param4\":\"1930\"}" }, { "end": "{\"value\":[{\"classifier\":\"data1\",\"params\":\"1234\",\"year\":\"2014\",\"month\":null,\"day\":null,\"source\":null}],\"primary\":true,\"param4\":\"2014\"}" } ] }
转换代码(DataWeave 2.x 通用,适配Mule 4及以上版本)
%dw 2.0 output application/json --- { values: payload.values map (currentItem) -> currentItem mapObject ((fieldValue, fieldKey) -> { (fieldKey): read(fieldValue, "application/json") }) }
实现逻辑说明
- 核心使用DataWeave内置的
read()函数完成解析,传入待处理的转义字符串和目标格式application/json即可,函数会自动识别并处理所有JSON转义符,不需要手动编写正则替换反斜杠。 - 遍历
values数组下的每一个对象,通过mapObject动态遍历对象内的所有键值对做解析,无需硬编码start/end这类字段名,后续同结构新增字段也可以自动适配。
转换后输出结果
{ "values": [ { "start": { "value": [ { "classifier": "data1", "params": "1234", "year": "1930", "month": null, "day": null, "source": null } ], "primary": true, "param4": "1930" } }, { "end": { "value": [ { "classifier": "data1", "params": "1234", "year": "2014", "month": null, "day": null, "source": null } ], "primary": true, "param4": "2014" } } ] }
避坑提示
- 不要使用
replace "\\" with ""这类手动替换转义符的方案,一旦原字符串内容本身包含合法转义字符(比如业务字段值里自带反斜杠、转义双引号),替换操作会破坏合法JSON结构,导致后续解析失败。 - 如果待解析的字符串可能存在不符合JSON规范的脏数据,可以给
read()函数加容错配置,比如read(fieldValue, "application/json", {default: {}}),解析失败时返回默认空对象,避免整个转换流程报错中断。
内容的提问来源于stack exchange,提问作者richard
相关产品推荐
相关产品推荐

