输入:
{
"drag": {
"misc": {
"prog": {
"ID": {
"type": "name",
"value": "ABC"
},
"ID": {
"type": "standard",
"value": "PQR"
}
}
}
},
"peak": {
"bird": {
"tech": {
"pl": {
"ID": {
"type": "room",
"value": "123"
},
"ID": {
"type": "sport",
"value": "football"
}
}
}
}
},
"ID": {
"type": "browser",
"value": "google"
},
"ID": {
"type": "day",
"value": "Wednesday"
}
}
所需输出:
{
"drag": {
"misc": {
"prog": {
"ID": {
"name": "ABC",
"standard": "PQR"
}
}
}
},
"peak": {
"bird": {
"tech": {
"pl": {
"ID": {
"room": "123",
"sport": "football"
}
}
}
}
},
"ID": {
"browser": "google",
"day": "Wednesday"
}
}
总结一下需求,我需要将 ID 键与类型和值键合并。 请注意:这只是一个示例有效负载。实际有效负载可以有 n 个嵌套对象。但是,ID 将具有相同的键,即类型和值。手动构建有效负载不是一种选择。
使用递归函数映射所有对象,如果一个元素具有名称为“ID”的所有键,那么我们将它们映射到具有键值“合并”的单个“ID”元素。如果不是,我们只是递归地将相同的逻辑应用于其子元素。除
Object
之外的所有类型均保持原样。
%dw 2.0
import * from dw::core::Arrays
output application/json
fun mapProg(x, idKeyname) =
x match {
case o is Object -> if (namesOf(o) every ($ == idKeyname))
{
ID: o mapObject (
($.'type'): $.value
)
}
else
(o mapObject ($$): mapProg($, idKeyname)) // recursively map child elements
else -> x
}
---
mapProg(payload, "ID")
输出:
{
"drag": {
"misc": {
"prog": {
"ID": {
"name": "ABC",
"standard": "PQR"
}
}
}
},
"peak": {
"bird": {
"tech": {
"pl": {
"ID": {
"room": "123",
"sport": "football"
}
}
}
}
},
"ID": {
"type": "browser",
"value": "google"
},
"ID": {
"type": "day",
"value": "Wednesday"
}
}