ペイロードの変換に取り組んでいます。私はここに状況があります。
入力ペイロードは以下のようになります:-
{
"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"
}}
これは、直接的なアプローチが理解しにくいように思われた後に私が到達した再帰的な解決策です。
%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
を削除し、代わりに関数のnullフィールドを削除したことに注意してください。これにより、含まれているオブジェクトが空であるかどうかを確認する前にnullが削除されることを確認できます。
mapObject
を使用すると、オブジェクトフィールドをループし、特定の条件を満たす場合にのみ結果オブジェクトに含めることができるため、この関数(両方のソリューション)が機能します。
ライアン、この関数はStudio6.2.3でエラーを生成しています。それ以外の条件を含める必要がありました。オブジェクトコンストラクターの中括弧で(key):valueを囲む必要があり、それ以外の条件を含める必要がありました。
%function filterKeyValue(key, value)
(
//((key): value) when acceptable(value)
{(key) : value} when acceptable(value)
otherwise {}
)
これは私にとってはうまくいきました(N.B. DataweaveはMuleバージョン3.8からのものです):
%function isEmpty(thing) thing match {
:null -> true,
arr is :array -> arr == [],
obj is :object -> obj == {},
'' -> true,
/\s+/ -> true,
default -> false
}
更新:
したがって、上記のRyanによるソリューションにこれを注入するには:
%function acceptable(value) (
!isEmpty(value)
)
私は最も単純で最も簡単な解決策を持っています。
%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
})
}
}
残念ながら、どのソリューションも機能しなかったため、以下のコードで2番目の「変換メッセージ」コンポーネントを使用し、両方のコンポーネントでskipNullOn = "everywhere"を使用しました。このコードは、空の要素(nullフィールド、空の文字列、空の配列、空のオブジェクト)を再帰的に検索し、それを削除します。
%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)
それが役に立てば幸い。
この機能を使用する
%function acceptable(value) (
!isEmpty(value)
)
これを行う簡単な方法はありません、あなたはこのようなことをすることができます
%dw 1.0
%output application/json
---
address: payload.address - "location" when (sizeOf (payload.address.location pluck $ filter $ != null)) == 0 otherwise payload
お役に立てれば。