如何忽略 DataWeave Mule esb 中的空对象
How to ignore empty objects in DataWeave Mule esb
我正在努力转换我的有效载荷。我这里有情况。
输入有效负载如下所示:-
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": {
"city": null,
"state": null
}
}}
我用%output application/json skipNullOn = "everywhere"
它returns我JSON如下
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": { }
}}
但是如果位置对象中的所有字段都是空的,我不想让位置对象为空 empty.I 我期待这样的事情
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam"
}}
没有直接的方法可以做到这一点,你可以这样做
%dw 1.0
%output application/json
---
address: payload.address - "location" when (sizeOf (payload.address.location pluck $ filter $ != null)) == 0 otherwise payload
希望对您有所帮助。
这是我在直接方法似乎难以理解之后得出的递归解决方案:
%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($)
}
)
请注意,我们在 %output
指令中删除了 skipNullOn="everywhere"
,而是删除了函数中的空字段。这使我们能够确保在我们检查包含对象是否为空之前删除空值。
该函数(在两种解决方案中)都有效,因为 mapObject
允许我们遍历对象字段,并且仅当它们满足特定条件时才将它们包含在结果对象中。
这对我有用(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)
)
Ryan,函数在 Studio 6.2.3 中产生错误。我必须包括一个否则的条件。我必须将 (key):value 括在对象构造函数花括号中,并且我必须包含一个否则条件:
%function filterKeyValue(key, value)
(
//((key): value) when acceptable(value)
{(key) : value} when acceptable(value)
otherwise {}
)
不幸的是,none 的解决方案对我有用,所以我使用了带有以下代码的第二个 'transform message' 组件,并在两个组件中都使用了 skipNullOn="everywhere"。此代码递归搜索空元素(空字段、空字符串、空数组和空对象)并将其删除。
%dw 1.0
%function removeEmptyInArray(arr) arr map (
(removeEmptyInArray($) when $ is :array
otherwise (removeEmptyInObject($) when $ is :object
otherwise $ when ($ != null and (sizeOf $) > 0) otherwise null))
) when arr != []
otherwise null
%function removeEmptyInObject(obj) obj mapObject (
'$$': (removeEmptyInArray($) when $ is :array
otherwise (removeEmptyInObject($) when $ is :object
otherwise $ when ($ != null and (sizeOf $) > 0) otherwise null))
)
%output application/json skipNullOn="everywhere"
---
removeEmptyInObject(payload)
希望对您有所帮助。
我有最简单最简单的解决方案。
%dw 1.0
%output application/json skipNullOn = "everywhere"
---
{
"address": {
"city": payload.address.city,
"company_name": payload.address.company_name,
"country_code": payload.address.country_code,
("location": {
"city": payload.address.location.city,
"state": payload.address.location.state
})
}
}
使用这个功能
%function acceptable(value) (
!isEmpty(value)
)
我正在努力转换我的有效载荷。我这里有情况。
输入有效负载如下所示:-
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": {
"city": null,
"state": null
}
}}
我用%output application/json skipNullOn = "everywhere"
它returns我JSON如下
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": { }
}}
但是如果位置对象中的所有字段都是空的,我不想让位置对象为空 empty.I 我期待这样的事情
{
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam"
}}
没有直接的方法可以做到这一点,你可以这样做
%dw 1.0
%output application/json
---
address: payload.address - "location" when (sizeOf (payload.address.location pluck $ filter $ != null)) == 0 otherwise payload
希望对您有所帮助。
这是我在直接方法似乎难以理解之后得出的递归解决方案:
%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($)
}
)
请注意,我们在 %output
指令中删除了 skipNullOn="everywhere"
,而是删除了函数中的空字段。这使我们能够确保在我们检查包含对象是否为空之前删除空值。
该函数(在两种解决方案中)都有效,因为 mapObject
允许我们遍历对象字段,并且仅当它们满足特定条件时才将它们包含在结果对象中。
这对我有用(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)
)
Ryan,函数在 Studio 6.2.3 中产生错误。我必须包括一个否则的条件。我必须将 (key):value 括在对象构造函数花括号中,并且我必须包含一个否则条件:
%function filterKeyValue(key, value)
(
//((key): value) when acceptable(value)
{(key) : value} when acceptable(value)
otherwise {}
)
不幸的是,none 的解决方案对我有用,所以我使用了带有以下代码的第二个 'transform message' 组件,并在两个组件中都使用了 skipNullOn="everywhere"。此代码递归搜索空元素(空字段、空字符串、空数组和空对象)并将其删除。
%dw 1.0
%function removeEmptyInArray(arr) arr map (
(removeEmptyInArray($) when $ is :array
otherwise (removeEmptyInObject($) when $ is :object
otherwise $ when ($ != null and (sizeOf $) > 0) otherwise null))
) when arr != []
otherwise null
%function removeEmptyInObject(obj) obj mapObject (
'$$': (removeEmptyInArray($) when $ is :array
otherwise (removeEmptyInObject($) when $ is :object
otherwise $ when ($ != null and (sizeOf $) > 0) otherwise null))
)
%output application/json skipNullOn="everywhere"
---
removeEmptyInObject(payload)
希望对您有所帮助。
我有最简单最简单的解决方案。
%dw 1.0
%output application/json skipNullOn = "everywhere"
---
{
"address": {
"city": payload.address.city,
"company_name": payload.address.company_name,
"country_code": payload.address.country_code,
("location": {
"city": payload.address.location.city,
"state": payload.address.location.state
})
}
}
使用这个功能
%function acceptable(value) (
!isEmpty(value)
)