web-dev-qa-db-ja.com

DataWeave Muleesbで空のオブジェクトを無視する方法

ペイロードの変換に取り組んでいます。私はここに状況があります。

入力ペイロードは以下のようになります:-

{
 "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"
}}
7
Infinity

これは、直接的なアプローチが理解しにくいように思われた後に私が到達した再帰的な解決策です。

%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 を使用すると、オブジェクトフィールドをループし、特定の条件を満たす場合にのみ結果オブジェクトに含めることができるため、この関数(両方のソリューション)が機能します。

9
Ryan Hoegg

ライアン、この関数はStudio6.2.3でエラーを生成しています。それ以外の条件を含める必要がありました。オブジェクトコンストラクターの中括弧で(key):valueを囲む必要があり、それ以外の条件を含める必要がありました。

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

これは私にとってはうまくいきました(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)
)
2
Jeff Bowman

私は最も単純で最も簡単な解決策を持っています。

%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

残念ながら、どのソリューションも機能しなかったため、以下のコードで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)

それが役に立てば幸い。

1
abk2192

この機能を使用する

%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

お役に立てれば。

0
AnupamBhusari