2016-10-07 14 views
5

Tôi đang làm việc để chuyển đổi tải trọng của mình. Tôi đã có tình hình ở đây.Cách bỏ qua các đối tượng trống trong DataWeave Mule esb

Input tải trông như thế này dưới một: -

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

tôi đã sử dụng %output application/json skipNullOn = "everywhere" nó trả tôi JSON như dưới đây

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

Nhưng tôi không muốn có đối tượng vị trí trống nếu tất cả các lĩnh vực trong các đối tượng vị trí trống. Tôi đang mong đợi một cái gì đó như thế này

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

Trả lời

5

Đây là một giải pháp đệ quy Tôi đến sau khi tiếp cận trực tiếp có vẻ khó hiểu:

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

Dưới đây là cách tiếp cận trực tiếp tôi bắt đầu với:

%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($) 
    } 
) 

Lưu ý rằng chúng tôi giảm skipNullOn="everywhere" trên %output chỉ thị, và bỏ các trường rỗng trong một hàm thay thế. Điều này cho phép chúng tôi đảm bảo rằng các giá trị rỗng được xóa trước chúng tôi kiểm tra xem đối tượng chứa có trống không.

Chức năng (trong cả hai giải pháp) hoạt động vì mapObject cho phép chúng tôi lặp qua các trường đối tượng và chỉ bao gồm chúng trong đối tượng kết quả nếu chúng đáp ứng một điều kiện nhất định.

0

Có i s không có cách nào thẳng để làm điều này, bạn có thể làm một cái gì đó như thế này

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

Hy vọng điều này sẽ giúp.

2

này đã làm việc cho tôi (NB Dataweave là từ Mule phiên bản 3.8):

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

UPDATE:

Vì vậy, để tiêm này trong dung dịch bởi Ryan trên:

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

bạn có thể chỉ cho việc chuyển đổi để sản xuất sản phẩm cuối cùng (trừ chai lọ thủy tinh)? Tôi nghĩ rằng chúng ta cần phải recurse. –

+1

Tôi nghĩ rằng điều này sẽ chỉ thay thế hàm 'có thể chấp nhận được 'của bạn, vì vậy phần còn lại của giải pháp sẽ vẫn như bạn đã viết. (mặc dù, có thể phải đảo ngược giá trị chân lý) - cập nhật câu trả lời của tôi để hiển thị thay đổi đối với hàm 'có thể chấp nhận'. –

2

Ryan, hàm này tạo ra lỗi trong Studio 6.2.3. Tôi phải bao gồm một điều kiện khác. Tôi đã phải bao quanh (key): giá trị trong constructor đối tượng dấu ngoặc nhọn, và tôi đã phải bao gồm một trường hợp điều kiện:

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

+1

Không nên đăng câu hỏi làm câu trả lời. Bạn có thể đặt câu hỏi mới bằng cách nhấp vào nút [Hỏi câu hỏi] (http://stackoverflow.com/questions/ask) và tham khảo bài đăng này. – Anthony

1

Thật không may, không ai trong số các giải pháp làm việc cho tôi, vì vậy tôi đã sử dụng thành phần 'chuyển đổi thông báo' thứ hai bằng mã bên dưới và được sử dụng skipNullOn = "everywhere" trong cả hai thành phần. Mã này đệ quy tìm kiếm các phần tử rỗng (các trường rỗng, các chuỗi rỗng, các mảng trống và các đối tượng trống) và loại bỏ nó.

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

Hy vọng điều đó sẽ hữu ích.

0

Tôi có giải pháp đơn giản nhất và dễ nhất.

%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

Sử dụng chức năng này

%function acceptable(value) (
    !isEmpty(value) 
) 
Các vấn đề liên quan