DataWeave を使用した型の強制

DataWeave では、​as​ 演算子を使用して、型を別の型に強制的に変換できます。型強制は実行時に適用されます。 開始する前に、Mule 4 アプリケーションでは DataWeave のバージョン 2.x が使用されることに注意してください。Mule 3 アプリケーションでの DataWeave については、​DataWeave バージョン 1.2 のドキュメント​を参照してください。 他の Mule バージョンの場合は、DataWeave の目次のバージョンセレクターを使用できます。

期待される型に一致しないプロパティを演算子に提供した場合、DataWeave は、自動的に、提供されたプロパティを必須の型に強制的に変換しようとします。

型強制のための DataWeave 型の定義

この DataWeave 例では、​String​ 型を使用して型 ​Currency​ を定義し、Java DecimalFormat パターン (​##​) を使用して値を書式設定し、​as​ を使用して ​price​ 値を ​Currency​ 型に強制的に変換します。

入力
<items>
    <item>
        <price>22.30</price>
    </item>
    <item>
        <price>20.31</price>
    </item>
</items>
DataWeave
%dw 2.0
output application/json
type Currency = String { format: "\$#,###.00"}
---
books: payload.items.*item map
    book:
        price: $.price as Currency
出力
{
  "books": [
    {
      "book": {
        "price": "22.30"
      }
    },
    {
      "book": {
        "price": "20.31"
      }
    }
  ]
}

型強制表

次の表は、可能な組み合わせと、変換で使用するスキーマからのプロパティを示しています。

ソース 対象 プロパティ

Range

Array

Number

Binary

String

Binary

String

Boolean

Number

DateTime

unit

LocalDateTime

DateTime

String

DateTime

format​ / ​locale

DateTime

LocalDate

LocalDateTime

LocalDate

String

LocalDate

format​ / ​locale

DateTime

LocalDateTime

String

LocalDateTime

format​ / ​locale

DateTime

LocalTime

LocalDateTime

LocalTime

Time

LocalTime

String

LocalTime

format​ / ​locale

DateTime

Number

unit

String

Number

format​ / ​locale

String

Period

String

Regex

DateTime

String

format​ / ​locale

LocalDateTime

String

format​ / ​locale

LocalTime

String

format​ / ​locale

LocalDate

String

format​ / ​locale

Time

String

format​ / ​locale

Period

String

TimeZone

String

Number

String

format​ / ​locale

Boolean

String

Range

String

,​ を区切り文字として使用して、範囲のすべての値を含む文字列を返します。

Type

String

DateTime

Time

LocalDateTime

Time

LocalTime

Time

String

Time

format

DateTime

TimeZone

Time

TimeZone`

String

TimeZone

型強制のプロパティ

プロパティ 説明

class

Object (オブジェクト) 型の Java クラスを受け入れます。

format

数値と日付を書式設定するための Java ​DecimalFormat​ パターンを受け入れます。

locale

Java ロケールを受け入れます。Java ​Locale​ オブジェクトは地域 (地理的、政治的、または文化的) を表します。

mode

日付値と時刻値の解析モード。有効な値: SMART​、​STRICT​、​LENIENT

LENIENT​ と ​SMART​ では、無効な日付の自動修正方法が異なります。また、​STRICT​ は、日付に対してエラーを返します。​mode​ を使用した​​を参照してください。

unit

値には ​milliseconds​ または ​seconds​ を使用できます。これは、Number (数値) から DateTime (日時) への変換で使用されます。

次の例は、​mode​ プロパティの使用方法を示しています。​LENIENT​ と ​SMART​ は、​02/31/2020​ のような無効な日付を受け取った場合でも有効な日付を返しますが、返される日付は異なります。 STRICT​ は、無効な日付に対してエラーを返します。例では、​yyyy​ ではなく ​uuuu​ を使用して年を表しています。

DataWeave スクリプト:
%dw 2.0
output application/json
---
{
  examples : {

    badDateWithLenient: '02/31/2020' as Date {mode: "LENIENT", format: 'MM/dd/uuuu'},
    badDateWithSmart: '02/31/2020' as Date {mode: "SMART", format: 'MM/dd/uuuu'}
  }
}
出力:
%dw 2.0
output application/json
---
{
  "examples": {
    "badDateWithLenient": "03/02/2020",
    "badDateWithSmart": "02/29/2020"
  }
}

無効な日付に対して STRICT を使用するとエラーが返されます。次の例では、​badDateWithStrict: '02/31/2020' as Date {mode: "STRICT", format: 'MM/dd/uuuu'}​ によってエラーが返されています。

"Cannot coerce String (02/31/2020) to Date, caused by: Text '02/31/2020' could not be parsed: Invalid date 'FEBRUARY 31'

9| 	badDateWithSmart:
    '02/31/2020' as Date {mode: "STRICT", format: 'MM/dd/uuuu'}
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

次の例では、2 つの文字列を日付形式に変換し、結果を連結します。最初の文字列は日付を表し、2 番目の文字列は時刻を表します。この変換は、​as​ を使用して最初の文字列を ​LocalDateTime​ に強制変換してから、指定された形式の ​String​ に強制変換します。また、​++​ を使用して結果を連結します。

DataWeave スクリプト:
%dw 2.0
output application/json
var s1= 20201228 // (uuuuMMdd),
var s2= 1608 //(HHMM)
---
(s1 ++ s2)
as LocalDateTime {format:"uuuuMMddHHmm"}
as String {format:"MM-dd-uuuu HH:mm:ss"}
出力:
"12-28-2020 16:08:00"

次の例も、文字列を日付形式に変換します。まず、この変換は ​as​ を使用して文字列を ​LocalDateTime​ 型に強制変換してから、結果を指定された出力形式の ​String​ 型に強制変換します。

DataWeave スクリプト:
%dw 2.0
output application/json
---
"8/30/2020 4:00:13 PM"
    as LocalDateTime {format: "M/dd/uuuu h:mm:ss a"}
    as String {format: "MM/dd/uuuu"}
出力:
"08/30/2020"

次の例では、文字列を 10 進数表現の数値に変換します。数値から文字列への変換時に ​format​ はゼロを追加するため、まず文字列値 ​"22"​ を ​Number​ に変換してから ​String​ に再度変換します。入力データが数値 ​22​ の場合、最初の ​Number​ 変換を実行する必要はありません。 後者の ​Number​ 変換では、出力を 10 進数表現の数値にします。

DataWeave スクリプト:
%dw 2.0
output application/json
---
{
     data: "22" as Number as String {format: ".00"} as Number
}
出力:
{
  "data": 22.00
}

次の例では、​locale​ プロパティを使用して数値と日付値を書式設定します。まず、数値を ​String​ 型に型強制し、Java DecimalFormat パターン (##) と ​locale​ プロパティ ​en​ (英語) または ​es​ (スペイン語) も使用する指定された出力形式に変換します。​locale: "en"​ プロパティでは、​.​ を使用して出力の数値の 10 進数表現を書式設定し、​locale: "es"​ プロパティでは、​,​ を使用して出力を書式設定します。
次に、日付値を ​Date​ 型に型強制した後、出力形式 ​dd-MMM-yy​ と ​locale​ プロパティ ​en​ (英語) または ​es​ (スペイン語) を使用する ​String​ 型に型強制します。​locale: "en"​ プロパティでは、月 ​MMM​ を英語で書式設定し、​locale: "es"​ プロパティでは、月をスペイン語で書式設定します。

DataWeave スクリプト:
%dw 2.0
output application/json
---
{
    enNumber: 12.3 as String {format: "##.##", locale: "en"},
    esNumber: 12.3 as String {format: "##.##", locale: "es"},
    esDate: "2020-12-31" as Date as String {format: "dd-MMM-yy", locale: "es"},
    enDate: "2020-12-31" as Date as String {format: "dd-MMM-yy", locale: "en"}
}
出力:
{
  "enNumber": "12.3",
  "esNumber": "12,3",
  "esDate": "31-dic.-20",
  "enDate": "31-Dec-20"
}