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