DataWeave のパターンマッチング

DataWeave では、パターン一致は、指定された式に一致する最初のパターンに対して実行されます。DataWeave では、4 つの種別のパターンがサポートされます。

各パターン種別に名前を付けても名前を付けなくても構いません。

パターン一致モデル
value match {
  case (<name>:)?<pattern> -> <when matched>
  case (<name>:)?<pattern> -> <when matched>
  else -> <when none of them matched>
}

値が一致するかどうかに基づくブール値の結果のみが必要な場合は、パターン一致を使用する代わりに matches 関数を使用できます。

リテラル値とのパターン一致

評価された値が単純なリテラル値に等しい場合に一致します。

次の例では、1 番目の項目で payload.string の値と照合し、ブール値を返します。2 番目の項目では同じ照合が実行されますが、ブール値と、検証された値への参照の両方を含むオブジェクトを返します。

変換
%dw 2.0
output application/json
---
{
  a: payload.string match {
    case "Emiliano" -> true
    case "Mariano" -> false
  },
  b: payload.string match {
    case str: "Emiliano" -> { "matches": true, value: str }
    case str: "Mariano" -> { "matches": false, value: str }
  }
}
入力
{
  "string": "Emiliano"
}
出力
{
  "a": true,
  "b": {
    "matches": true,
    "value": "Emiliano"
  }
}

式に対するパターン一致

提供された式が true を返す場合に一致します。

次の例では、1 番目の項目で payload.string の値の 2 つの選択肢と照合し、条件に応じて別の文字列を追加します。2 番目の項目では、3 と比較して payload.number の値が「greater than」(より大)、「less than」(より小)、または「equal」(等しい) かどうかを評価し、対応する文字列を返します。

変換
%dw 2.0
output application/json
---
{
  a: payload.string match {
    case str if str == "Mariano" -> str ++ " de Achaval"
    case str if str == "Emiliano" -> str ++ " Lesende"
  },
  b: payload.number match {
    case num if num == 3 -> "equal"
    case num if num > 3 -> "greater than"
    case num if num < 3 -> "less than"
  }
}
入力
{
  "string": "Emiliano",
  "number": 3.14
}
出力
[
  {
    "a": "Emiliano Lesende",
    "b": "greater than"
  }
]

データ型に対するパターン一致

評価された値が、指定されたデータ型の場合に一致します。

次の例では、1 番目の項目で payload.a の型を評価し、対応する型名の文字列を返します。2 番目の項目でも同様ですが、payload.b の値も返します。

変換
%dw 2.0
output application/json
---
{
  a: payload.a match {
    case is Object -> 'OBJECT'
    case is String -> 'STRING'
    case is Number -> 'NUMBER'
    case is Boolean -> 'BOOLEAN'
    case is Array -> 'ARRAY'
    case is Null -> 'NULL'
    else -> 'ANOTHER TYPE'
  },
  b: payload.b match {
    case y is Object -> { 'Type': { 'OBJECT' : y} }
    case y is String -> { 'Type': { 'STRING' : y} }
    case y is Number -> { 'Type': { 'NUMBER' : y} }
    case y is Boolean -> { 'Type': { 'BOOLEAN' : y} }
    case y is Array -> { 'Type': { 'ARRAY' : y} }
    case y is Null -> { 'Type': { 'NULL' : y} }
    else -> { 'Type': { 'ANOTHER TYPE' : payload.b} }
  }
}
入力
{
  "a": "Emiliano",
  "b": 3.14
}
出力
{
  "a": "STRING",
  "b": {
    "Type": {
      "NUMBER": 3.14
    }
  }
}

正規表現に対するパターン一致

評価された値が、提供された Java 正規表現に適合する場合に一致します。次の例では、入力ペイロードに文字列の配列が含まれます。スクリプトは map 関数を使用して配列を反復処理します。Java 正規表現に対して各要素を評価し、入力との一致に基づいてオブジェクトを出力します。

変換
%dw 2.0
output application/json
---
{
  a: payload.phones map ($ match {
     case phone matches /\+(\d+)\s\((\d+)\)\s(\d+\-\d+)/ -> { country: phone[1]}
     case phone matches /\((\d+)\)\s(\d+\-\d+)/ -> { area: phone[1], number: phone[2] }
   }),
 b: payload.phones map ($ match {
   case phone matches /\+(\d+)\s\((\d+)\)\s(\d+\-\d+)/ -> { country: phone[1], area: phone[2], number: phone[3] }
   case phone matches /\((\d+)\)\s(\d+\-\d+)/ -> { area: phone[1], number: phone[2] }
 })
}
入力
{
  "phones": [
    "+1 (415) 229-2009",
    "(647) 456-7008"
  ]
}
出力
{
  "a": [
    {
      "country": "1"
    },
    {
      "area": "647",
      "number": "456-7008"
    }
  ],
  "b": [
    {
      "country": "1",
      "area": "415",
      "number": "229-2009"
    },
    {
      "area": "647",
      "number": "456-7008"
    }
  ]
}

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub