我必须根据变量“id”更新 JSON 对象中的值。因此,在下一个 JSON 数组中,当 id = "746936" 时,该 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"
}
]
}
]
当我制作地图并使用此代码再次重建 JSON 时,它就可以正常运行。
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"
}
]
}
]
但是代码很多,而且 Mulesoft 也有更新运算符和函数,我尝试了一些类似的方法,但没有一个给出正确的结果:
// attempt 1
xyz map ($ update {
case .textMessages["746936"].isSendStatus -> true
})
// attempt 2
xyz map(item,index) -> (item update ["textMessages"] with (if ($.id == "746936")
{
id: $.id,
isSendStatus: true,
message: $.message
}
else
$
)
)
但是当使用更新运算符或函数时它不起作用。我认为问题在于更新函数或运算符对数组有问题。
我不会说这是很多代码。使用更新运算符可能不会减少代码的大小,但对于维护来说也许更重要的是,您可以进行更改以更好地传达代码的意图。
您可以使用filterObject()来删除所有具有空值的键,而不是对每个键进行空值检查。
用更新运算符替换剩余条件可能被认为是风格问题,但它允许您仅映射需要更改的字段。
%dw 2.0
output application/json
---
payload map (item,index) ->
item filterObject ((value, key, index) -> !(value is Null)) // remove all keys that have a null value
update {
case textMessages at .textMessages -> // update textMessages
textMessages map ((message) -> message update { // update each item in textMessages
case status at .isSendStatus -> if((message.id == "746936") and (item.taskReferenceId == "440827")) true else status // update only the
})
}
为了测试,我添加了一个具有空值的项目。
输入示例:
[
{
"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"
}
]
},
{
"referenceId": null,
"taskReferenceId": "440828",
"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"
}
]
},
{
"taskReferenceId": "440828"
}
]