web-dev-qa-db-fra.com

Comment ignorer des objets vides dans DataWeave Mule esb

Je travaille sur la transformation de ma charge utile. J'ai la situation ici.

La charge utile d'entrée ressemble à ceci en dessous d'un: -

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

J'ai utilisé %output application/json skipNullOn = "everywhere" il me retourne JSON comme ci-dessous

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

Mais je ne veux pas d'objet d'emplacement vide si tous les champs des objets d'emplacement sont vides. J'attends quelque chose comme ça

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

C'est une solution récursive à laquelle j'ai abouti après que l'approche directe semblait difficile à comprendre:

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

Voici l'approche directe avec laquelle j'ai commencé:

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

Notez que nous avons abandonné skipNullOn="everywhere" sur la directive %output et supprimé les champs nuls d'une fonction. Cela nous permet de nous assurer que les valeurs NULL sont supprimées before nous vérifions si l'objet contenant est vide.

La fonction (dans les deux solutions) fonctionne parce que mapObject nous permet de parcourir les champs d'objet et de les inclure dans l'objet résultat uniquement s'ils remplissent une certaine condition.

6
Ryan Hoegg

Ryan, la fonction génère des erreurs dans Studio 6.2.3. Je devais inclure une condition contraire. Je devais entourer la (clé): valeur dans les accolades du constructeur de l'objet, et je devais inclure une condition contraire: 

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

2
Ethan Port

Cela a fonctionné pour moi (N.B. Dataweave est à partir de la version 3.8 de Mule):

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

METTRE À JOUR:

Donc, pour injecter ceci dans la solution de Ryan ci-dessus:

%function acceptable(value) (
    !isEmpty(value)
)
2
Jeff Bowman

J'ai la solution la plus simple et la plus facile.

%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
  })
  } 
}
1
Zahid

Malheureusement, aucune des solutions ne fonctionnant pour moi, j'ai donc utilisé un deuxième composant 'Transformer Message' avec le code ci-dessous et utilisé skipNullOn = "partout" dans les deux composants. Ce code recherche récursivement les éléments vides (champs nuls, chaînes vides, tableaux vides et objets vides) et les supprime.

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

J'espère que ça aide.

1
abk2192

Utilisez cette fonction

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

Il n'y a pas de moyen direct de le faire, vous pouvez faire quelque chose comme ça

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

J'espère que cela t'aides.

0
AnupamBhusari