繁体   English   中英

如何忽略 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"它返回我 JSON 如下

{
 "address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": { }
}}

但是如果位置对象中的所有字段都是空的,我不想让位置 object 为空。我期待这样的事情

{   
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam"
}}

这是我在直接方法似乎难以理解后得出的递归解决方案:

%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允许我们遍历对象字段,并且只有当它们满足某个条件时才将它们包含在结果对象中。

这对我有用(NB 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 {} ) 

不幸的是,没有一个解决方案对我有用,所以我在下面的代码中使用了第二个“转换消息”组件,并在两个组件中使用了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
  })
  } 
}

没有直接的方法可以做到这一点,你可以做这样的事情

%dw 1.0
%output application/json
--- 
address:  payload.address - "location" when (sizeOf (payload.address.location pluck $ filter $ != null)) == 0 otherwise payload

希望这可以帮助。

使用此功能

%function acceptable(value) (
    !isEmpty(value)
)

对我来说最简单的方法是保留 skipNullOn = "everywhere" 然后使用这个 if 条件:

{ "location": if (payload.address.location.city? or payload.address.location.state?) {
    "city": payload.address.location.city,
    "state": payload.address.location.state}
} else null }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM