我正在努力改变我的有效载荷。这里的情况是这样的。
输入有效载荷如下所示:
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": {
"city": null,
"state": null
}
}}我使用了%output application/json skipNullOn = "everywhere",它返回JSON,如下所示
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": { }
}}但是,如果位置对象中的所有字段都是空的,我不希望有空位置对象。
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam"
}}发布于 2016-10-08 22:37:42
在直接方法似乎难以理解之后,我找到了一个递归解决方案:
%dw 1.0
%output application/json
%function acceptable(value) (
(value default {}) != {}
)
%function filterKeyValue(key, value) (
((key): value) when acceptable(value)
)
%function removeFields(o) o
unless o is :object
otherwise o mapObject
(filterKeyValue($$, removeFields($)))
---
removeFields(payload)下面是我开始使用的直接方法:
%dw 1.0
%output application/json
%function skipNulls(o) o
unless o is :object
otherwise o mapObject {
(($$): $) when ($ != null)
}
%function skipEmpty(o) o mapObject {
(($$): $) when ($ != {})
}
---
address: skipEmpty(payload.address
mapObject {
($$): skipNulls($)
}
)注意,我们删除了skipNullOn="everywhere"指令中的%output,而是删除了函数中的空字段。这允许我们在检查包含的对象是否为空之前确保移除空对象。
函数(在这两种解决方案中)都能工作,因为mapObject允许我们在对象字段上循环,并且只有当它们满足某种条件时,才能将它们包含在结果对象中。
发布于 2016-12-28 04:37:50
这对我起了作用(N.B.DataWeave来自Mule版本3.8):
%function isEmpty(thing) thing match {
:null -> true,
arr is :array -> arr == [],
obj is :object -> obj == {},
'' -> true,
/\s+/ -> true,
default -> false
}更新:
因此,要在Ryan上面的解决方案中注入这一点:
%function acceptable(value) (
!isEmpty(value)
)发布于 2017-05-04 22:54:59
Ryan,函数在Studio 6.2.3中产生错误。我必须包括另一种情况。我必须在对象构造函数大括号中包围(key):value,并且必须包含一个否则的条件:
%function filterKeyValue(key, value)
(
//((key): value) when acceptable(value)
{(key) : value} when acceptable(value)
otherwise {}
)
https://stackoverflow.com/questions/39924049
复制相似问题