首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何忽略DataWeave Mule esb中的空对象

如何忽略DataWeave Mule esb中的空对象
EN

Stack Overflow用户
提问于 2016-10-07 18:51:35
回答 6查看 19.4K关注 0票数 7

我正在努力改变我的有效载荷。这里的情况是这样的。

输入有效载荷如下所示:

代码语言:javascript
运行
复制
{
 "address": {
    "city": "bab",
    "company_name": "asdast",
    "country_code": "sam",
    "location": {
    "city": null,
    "state": null
  }
}}

我使用了%output application/json skipNullOn = "everywhere",它返回JSON,如下所示

代码语言:javascript
运行
复制
{
 "address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam",
"location": { }
}}

但是,如果位置对象中的所有字段都是空的,我不希望有空位置对象。

代码语言:javascript
运行
复制
{   
"address": {
"city": "bab",
"company_name": "asdast",
"country_code": "sam"
}}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-10-08 22:37:42

在直接方法似乎难以理解之后,我找到了一个递归解决方案:

代码语言:javascript
运行
复制
%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)

下面是我开始使用的直接方法:

代码语言:javascript
运行
复制
%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允许我们在对象字段上循环,并且只有当它们满足某种条件时,才能将它们包含在结果对象中。

票数 11
EN

Stack Overflow用户

发布于 2016-12-28 04:37:50

这对我起了作用(N.B.DataWeave来自Mule版本3.8):

代码语言:javascript
运行
复制
%function isEmpty(thing) thing match {
  :null -> true,
  arr is :array -> arr == [],
  obj is :object -> obj == {},
  '' -> true,
  /\s+/ -> true,
  default -> false
}

更新:

因此,要在Ryan上面的解决方案中注入这一点:

代码语言:javascript
运行
复制
%function acceptable(value) (
    !isEmpty(value)
)
票数 2
EN

Stack Overflow用户

发布于 2017-05-04 22:54:59

Ryan,函数在Studio 6.2.3中产生错误。我必须包括另一种情况。我必须在对象构造函数大括号中包围(key):value,并且必须包含一个否则的条件:

代码语言:javascript
运行
复制
%function filterKeyValue(key, value) 
(
  //((key): value) when acceptable(value)
  {(key) : value} when acceptable(value)
  otherwise {}
)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39924049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档