webentwicklung-frage-antwort-db.com.de

So ignorieren Sie leere Objekte in DataWeave Mule esb

Ich arbeite daran, meine Nutzlast umzuwandeln. Ich habe die Situation hier.

Die eingegebene Nutzlast sieht unter einer wie folgt aus: -

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

Ich habe %output application/json skipNullOn = "everywhere" verwendet, es gibt mir JSON wie folgt zurück

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

Ich möchte jedoch kein leeres Standortobjekt haben, wenn alle Felder in Standortobjekten leer sind. Ich erwarte so etwas

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

Dies ist eine rekursive Lösung, zu der ich kam, nachdem der direkte Ansatz schwer zu verstehen schien:

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

Hier ist der direkte Ansatz, mit dem ich angefangen habe:

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

Beachten Sie, dass wir skipNullOn="everywhere" in der %output-Direktive abgelegt und stattdessen Nullfelder in einer Funktion entfernt haben. Dadurch können wir sicherstellen, dass die Nullen entfernt werden. before wir prüfen, ob das enthaltende Objekt leer ist.

Die Funktion (in beiden Lösungen) funktioniert, weil mapObject es uns ermöglicht, die Objektfelder zu durchlaufen und sie nur dann in das Ergebnisobjekt aufzunehmen, wenn sie eine bestimmte Bedingung erfüllen.

6
Ryan Hoegg

Ryan, die Funktion erzeugt Fehler in Studio 6.2.3. Ich musste eine anderweitige Bedingung einschließen. Ich musste den (key): -Wert in geschweiften Klammern des Objektkonstruktors einschließen und eine andere Bedingung angeben: 

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

2
Ethan Port

Das hat für mich funktioniert (N.B. Dataweave ist von Mule Version 3.8):

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

AKTUALISIEREN:

Um dies in die Lösung von Ryan oben zu injizieren:

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

Ich habe die einfachste und einfachste Lösung.

%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

Leider hat keine der Lösungen für mich funktioniert, also habe ich eine zweite "Nachricht transformieren" -Komponente mit dem folgenden Code und skipNullOn = "everywhere" in beiden Komponenten verwendet. Dieser Code sucht rekursiv nach leeren Elementen (Nullfeldern, leeren Strings, leeren Arrays und leeren Objekten) und entfernt sie.

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

Ich hoffe es hilft.

1
abk2192

Verwenden Sie diese Funktion

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

Es gibt keinen direkten Weg, dies zu tun. Sie können so etwas tun

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

Hoffe das hilft.

0
AnupamBhusari