如何忽略 DataWeave Mule esb 中的空对象
Posted
技术标签:
【中文标题】如何忽略 DataWeave Mule esb 中的空对象【英文标题】:How to ignore empty objects in DataWeave Mule esb 【发布时间】:2017-02-16 20:30:58 【问题描述】:我正在转换我的有效载荷。我已经掌握了这里的情况。
输入负载如下所示:-
"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"
【问题讨论】:
【参考方案1】:使用此功能
%function acceptable(value) (
!isEmpty(value)
)
【讨论】:
【参考方案2】:我有最简单最简单的解决方案。
%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
)
【讨论】:
【参考方案3】:不幸的是,没有一个解决方案对我有用,所以我使用了第二个带有以下代码的“转换消息”组件,并在两个组件中都使用了 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)
希望对你有帮助。
【讨论】:
【参考方案4】:Ryan,该函数在 Studio 6.2.3 中产生错误。我必须包括一个其他条件。我必须将 (key):value 括在对象构造函数花括号中,并且必须包含一个 else 条件:
%function filterKeyValue(key, value)
(
//((key): value) when acceptable(value)
(key) : value when acceptable(value)
otherwise
)
【讨论】:
不应将问题作为答案发布。您可以点击 按钮提出新问题并参考这篇文章。 @Anthony 你在说什么? Ethan 的回答是合理的,增加了对原始答案的看法,并添加了一些有用的评论。他的回答不是一个直接的问题。这是谈话的另一个分支。在您尝试监管其他用户的 cmets 之前,您可能应该先尝试解析它们。也许您应该了解内容而不是判断人。有一件事很清楚,你在拖钓。 @granthbr 对于提供虚假评论,我深表歉意。我没有评判回答者,但误判了他的回答。不幸的是,cmets 上没有反对按钮,但您可以标记我的评论并将其标记为您认为合适的内容。【参考方案5】:这是我在直接方法似乎难以理解之后得出的递归解决方案:
%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
允许我们遍历对象字段,并且仅当它们满足特定条件时才将它们包含在结果对象中。
【讨论】:
【参考方案6】:这对我有用(注意 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)
)
【讨论】:
您能否展示转换以产生最终输出(减去空瓶)?我认为我们需要递归。 我认为这只会替换您的acceptable
函数,因此解决方案的其余部分应该保留您编写的内容。 (尽管可能必须反转真值)——更新了我的答案以显示对 acceptable
函数的更改。【参考方案7】:
没有直接的方法可以做到这一点,你可以这样做
%dw 1.0
%output application/json
---
address: payload.address - "location" when (sizeOf (payload.address.location pluck $ filter $ != null)) == 0 otherwise payload
希望这会有所帮助。
【讨论】:
以上是关于如何忽略 DataWeave Mule esb 中的空对象的主要内容,如果未能解决你的问题,请参考以下文章
从dataweave 2.0 Mule 4中的父JSON对象中提取JSON键值对的子集作为对象
在dataweave 2.0 Mule4中将XML CDATA格式转换为JSON格式
Mule DataWeave 转换消息失败,缺少元数据:id 属性