2016-10-07 11 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": { } 
}} 

Но я не хочу иметь пустой объект место, если все поля в объектах размещения пусто. Я ожидаю чего-то вроде этого

{ 
"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) 

Вот прямой подход, я начал с:

%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, и вместо этого удалили нулевые поля в функции. Это позволяет нам убедиться, что nulls удалены до мы проверяем, является ли содержащий объект пустым.

Функция (в обоих решениях) работает, потому что mapObject позволяет нам пересекать поля объекта и включать их в объект результата только в том случае, если они удовлетворяют определенному условию.

0

Там i s нет прямого способа сделать это, вы можете сделать что-то вроде этого

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

Надеюсь, это поможет.

2

Это работает для меня (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 
} 

UPDATE:

Таким образом, чтобы придать этим в решении Райан выше:

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

Не могли бы вы показать трансформацию, чтобы получить окончательный результат (минус пустышки)? Думаю, нам нужно вернуться. –

+1

Я думаю, что это просто заменит вашу 'приемлемую' функцию, поэтому остальное решение должно остаться, как вы его написали. (хотя, возможно, придется инвертировать значения истинности) - обновил мой ответ, чтобы показать изменение на 'приемлемую' функцию. –

2

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 = «всюду» в обоих компонентах. Этот код рекурсивно ищет пустые элементы (пустые строки, пустые строки, пустые массивы и пустые объекты) и удаляет их.

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