我想比较两个对象,并将它们与补丁json数据合并。如果修补程序对象中的值为null,则比较有效负载和修补程序,并从有效负载中删除字段。
输入:
{
"firstname":"John",
"lastname":"Sam",
"city": "San Jose",
"path": "additional",
"location-1": {
"address": "USA",
"pin": null
},
"location-2": {
"address": null,
"place": "abc",
"pin": null
}
}数据编织代码:
%dw 2.0
output application/json
import mergeWith from dw::core::Objects
var patch = {
lastname:"Courtney",
age:"18",
path: "",
company: "MR",
firstname: null,
city: null,
"location-1": {
"address": "USA",
"pin": null
}
}
---
(payload mergeWith ((patch)) filterObject ($ != null ))预期输出:
{
"lastname": "Courtney",
"age": "18",
"path": "",
"company": "MR",
"location-1": {
"address": "USA"
},
"location-2": {
"address": null,
"place": "abc",
"pin": null
}
}但是,我无法从输出中的Loce-1对象中删除空值。
发布于 2022-09-25 02:41:26
如果我正确理解了请求,那么您可以使用filterObject()来删除需要删除的元素,使用mapObject()来递归地将筛选应用于子对象。递归函数removeMergedNull()实现了这个逻辑。
我编写了在函数filterObject()中保留用于shouldRemove() ()的元素的条件。
然后我就把它应用到你剧本的结果上。
%dw 2.0
output application/json
import mergeWith from dw::core::Objects
var patch = {
lastname:"Courtney",
age:"18",
path: "",
company: "MR",
firstname: null,
city: null,
"location-1": {
"address": "USA",
"pin": null
}
}
fun shouldRemove(x,key, p)=(p == null) or !(keysOf(p) contains (key) as String) and !(p[key as String] == null)
fun removeMergedNull(o, p)=
o
filterObject ((value, key, index) -> value match {
case x is String -> shouldRemove(x, key, p)
case x is Null -> shouldRemove(x, key, p)
else -> true
})
mapObject ((value, key, index) -> value match {
case child is Object -> (key): removeMergedNull(child, p[key as String])
else -> (key):value
})
---
removeMergedNull((payload mergeWith ((patch)) filterObject ($ != null )), patch)输出:
{
"location-2": {
"address": null,
"place": "abc",
"pin": null
},
"lastname": "Courtney",
"age": "18",
"path": "",
"company": "MR",
"location-1": {
"address": "USA"
}
}https://stackoverflow.com/questions/73840177
复制相似问题