我的输入
{
"Root": {
"order": [
{
"locale": "en-US",
"orderItems": [
{
"product": {
"partNumber": "23853864"
},
"itemSpecifics": {
"options": {
"color": "Olive",
"size": "S"
},
"actualPrice": "7",
"customItemData": {
"TEMP_8401": "8.95",
"TEMP_150207": "3.00"
}
}
}
]
}
... Large amount of JSON Data ...
]
}
}
预期产量
{
"Root": {
"order": [
{
"locale": "en-US",
"orderItems": [
{
"product": {
"partNumber": "23853864"
},
"itemSpecifics": {
"options": {
"color": "Olive",
"size": "S"
},
"actualPrice": "7",
"customItemData": {
"8401": "8.95",
"150207": "3.00"
}
}
}
]
}
... Large amount of JSON Data ...
]
}
}
我想删除"TEMP_"
对象键中的"customItemData"
,但是我不想再次手动重新映射整个JSON对象,一一分配属性。有没有其他选择? DataWeave中是否有更短的逻辑?我正在使用Mule 3.9.0。
答案 0 :(得分:0)
这使用递归和模式匹配来遍历数据结构并修改键。如果该键不包含字符串"TEMP"
,则将其保留不变,如果存在,它将根据您的要求进行修改。
%dw 1.0
%output application/json
%function applyToKeys(e, fn)
e match {
:array -> $ map ((v) -> applyToKeys(v, fn)),
:object -> $ mapObject ((v, k) -> {(fn(k)): applyToKeys(v, fn)}),
default -> $
}
---
applyToKeys(payload,
((key) -> ((key as :string) splitBy "_" )[1]
when ((key as :string) contains "TEMP")
otherwise key))
在使用这种解决方案时,请记住权衡。该代码当然不那么冗长,但是需要对递归,模式匹配,lambda和更高阶函数等高级概念有深入的了解。