2016-10-07 69 views
5

我正致力於轉換我的有效負載。我在這裏得到了這種情況。如何忽略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": { } 
}} 

但我不希望有,如果所有字段爲空位置對象在位置的對象是empty.I期待這樣的事情

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

回答

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) 

這裏是直接的方法,我開始:我們在下跌skipNullOn="everywhere"

%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指令,而是刪除函數中的空字段。這使我們可以確保在之前我們檢查包含的對象是否爲空,從而刪除空值

函數(在這兩種解決方案中)的工作原理是因爲mapObject允許我們遍歷對象字段,並且只有在它們滿足特定條件時纔將它們包含在結果對象中。

0

有我沒有直接的方式做到這一點,你可以做這樣的事情

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

希望這會有所幫助。

2

這爲我工作(NB Dataweave是騾子版本3.8):

%function isEmpty(thing) thing match { 
    :null -> true, 
    arr is :array -> arr == [], 
    obj is :object -> obj == {}, 
    '' -> true, 
    /\s+/ -> true, 
    default -> false 
} 

UPDATE:

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

能告訴你產生的最終輸出(減去空瓶)的轉型?我認爲我們需要緩解。 –

+1

我認爲這隻會取代你的'可接受'功能,所以解決方案的其餘部分應該保持原樣。 (儘管可能必須反轉真值) - 更新我的答案以顯示對「可接受」函數的更改。 –

2

因此,上面由Ryan注入此溶液中Ryan,該函數在Studio 6.2.3中產生錯誤。我不得不包含其他條件。我不得不環繞(鍵):在對象的構造大括號價值,我必須包括否則條件:

%function filterKeyValue(key, value) 
 
(
 
    //((key): value) when acceptable(value) 
 
    {(key) : value} when acceptable(value) 
 
    otherwise {} 
 
)

+1

不應將問題張貼爲答案。您可以通過單擊[Ask Question](問問題)(http://stackoverflow.com/questions/ask)按鈕來提出一個新問題並參考此帖子。 – Anthony

1

不幸的是,沒有一個解決方案,爲我工作,所以我在下面的代碼中使用了第二個「轉換消息」組件,並在這兩個組件中使用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) 

希望它有幫助。

0

我有最簡單和最簡單的解決方案。

%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 
    }) 
    } 
} 
0

使用此功能

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