Mulesoft DataWeave:用update操作符/函数更新指定JSON对象属性
需求与问题
需求
在给定的JSON数组中,当id="746936"且taskReferenceId="440827"时,将对应JSON对象的isSendStatus属性设为true。
输入数据
var xyz = [ { "referenceId": "WRK-2403472", "taskReferenceId": "440827", "textMessages": [ { "id": "746935", "isSendStatus": false, "message": "test1" }, { "id": "746936", "isSendStatus": false, "message": "test2" } ] }, { "referenceId": "WRK-2403470", "taskReferenceId": "440828", "textMessages": [ { "id": "746935", "isSendStatus": false, "message": "test3" } ] } ]
已实现的Map方法(可行但代码量较大)
xyz map (item,index) -> { (referenceId : item.referenceId) if (item.referenceId != null), (taskReferenceId: item.taskReferenceId) if (item.taskReferenceId != null), (textMessages: item.textMessages map { id: $.id, isSendStatus: if(($.id == "746936") and (item.taskReferenceId == "440827")) true else $.isSendStatus, message: $.message }) if (item.textMessages != null) }
正确输出结果
[ { "referenceId": "WRK-2403472", "taskReferenceId": "440827", "textMessages": [ { "id": "746935", "isSendStatus": false, "message": "test1" }, { "id": "746936", "isSendStatus": true, "message": "test2" } ] }, { "referenceId": "WRK-2403470", "taskReferenceId": "440828", "textMessages": [ { "id": "746935", "isSendStatus": false, "message": "test3" } ] } ]
尝试的错误写法
写法1
// attempt 1 xyz map ($ update { case .textMessages["746936"].isSendStatus -> true })
写法2
// attempt 2 xyz map(item,index) -> (item update ["textMessages"] with (if ($.id == "746936") { id: $.id, isSendStatus: true, message: $.message } else $ ) )
正确的Update操作符实现方式
可以通过嵌套update和map来精准定位并修改目标元素,代码更简洁:
xyz map ($ update { case item if item.taskReferenceId == "440827" -> item update { case .textMessages -> $ map (msg) -> msg update { case .isSendStatus if msg.id == "746936" -> true } } })
或者更直观的分支判断写法:
xyz map (item) -> if (item.taskReferenceId == "440827") item update { case .textMessages -> $ map (msg) -> if (msg.id == "746936") msg update { case .isSendStatus -> true } else msg } else item
说明
- 外层通过
map遍历数组对象,先筛选出taskReferenceId匹配的对象 - 对匹配的对象,使用
update操作符修改其textMessages属性 - 内层对
textMessages数组用map遍历,仅对id="746936"的元素,通过update将isSendStatus设为true - 不匹配的对象直接原样返回,避免无效修改
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

