如何忽略 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键值对的子集作为对象

使用 Mule Dataweave 导入 CSV?

在dataweave 2.0 Mule4中将XML CDATA格式转换为JSON格式

Mule DataWeave 转换消息失败,缺少元数据:id 属性

Mule 4:Dataweave 2.0:如何处理大小超过10k的数据库记录?

为什么Multipartform-data在响应Mule Dataweave时删除Nill?