型の値構成

DataWeave では値を使用してデータを表します。値にはそれぞれデータ型が関連付けられています。型には文字列、配列、ブール、数値、オブジェクト、日付、時刻などさまざまなものがあります。各型では、値を作成するいくつかの方法がサポートされています。このトピックでは、その多くの作成方法について説明します。 開始する前に、Mule 4 アプリケーションでは DataWeave のバージョン 2.x が使用されることに注意してください。Mule 3 アプリケーションでの DataWeave については、​DataWeave バージョン 1.2 のドキュメント​を参照してください。 他の Mule バージョンの場合は、DataWeave の目次のバージョンセレクターを使用できます。

DataWeave が提供する型はモジュールにバンドルされ、モジュールにも、関連する関数が含まれます。

dw::Core​ モジュール内の型 (Core 型) は、Core モジュールをインポートしなくても使用できます。他のモジュールについては、モジュールをインポートしてその関数と型を使用できるようにする必要があります。

各 DataWeave 型で使用できる値、それらの値の作成方法、使用される一般的なパターンについて理解しておくことが重要です。

Array (配列) (dw::Core 型)

配列には、サポートされるすべての型の要素を保持できます。配列の例を次に示します。

例: DataWeave 配列
%dw 2.0
output application/json
var x = "words"
---
[ "My", "three", x ]

条件付き要素

配列では、条件に基づいて表示する (または表示しない) 要素を定義できます。

条件付き要素は、次の例のように、​(value) if condition​ の形式をとります。

例: if 条件
%dw 2.0
output application/json
---
[(1) if true, (2) if false]
出力
[1]

Boolean (ブール) (dw::Core 型)

Boolean​ は、キーワード ​true​ および ​false​ によって定義されます。

CData (dw::Core 型)

XML では、​CData​ という名前のカスタム型を定義します。これは ​String​ を継承し、拡張します。これを使用して、CDATA XML ブロックを識別します。CDATA 内でコンテンツをラップするか、CDATA ブロック内に入力文字列が到達したかどうかを確認するように、これを使用してライターに指示することができます。

変換
%dw 2.0
output application/xml encoding="UTF-8"
---
{
  users:
  {
    user : "Mariano" as CData,
    age : 31 as CData
  }
}
出力
<?xml version="1.0" encoding="UTF-8"?>
<users>
  <user><![CDATA[Mariano]]></user>
  <age><![CDATA[31]]></age>
</users>

日時 (dw::Core 型)

DataWeave の日付は ISO-8601 標準​に従い、リテラルは ​|​ 文字の間に定義されます。

この言語には次のネイティブの日付型があります。

  • Date

  • DateTime

  • LocalDateTime

  • LocalTime

  • Period

  • Time

  • TimeZone

Date (日付)

Year​、​Month​、および ​Day​ で表され、​|uuuu-MM-dd|​ として指定される ​Date​。​Date​ 型に Time コンポーネントはありません。

|2003-10-01|

DateTime

タイムゾーン内の日付と時刻。これは ​Date​ + ​Time​ + ​TimeZone​ を接続したものです。

|2003-10-01T23:57:59-03:00|

LocalDateTime

現在の ​TimeZone​ 内の ​DateTime​。

|2003-10-01T23:57:59|

LocalTime

現在の ​TimeZone​ 内の ​Time​。

Period (期間)

Period​ は時間を表します。この型は次の形式を取ります。

  • P[n]Y[n]M[n]DT[n]H[n]M[n]S

  • P<date>T<time>`

[n] は、[n] の後の各日時要素の値で置き換えられます。

Period​ には 2 つのサブカテゴリがあります。

  • DatePeriod
    日付ベースの時間 (1 年、2 か月、3 日など)。この式は日付ベースのため、ミリ秒に変換できません。たとえば、月が 31 日かどうかは指定されず、年がうるう年かどうかは指定されません。データは単に日数を表します。DataWeave では、構文は ​|P1Y|​ です。

  • Duration
    時間ベースの時間 (1 秒、2 時間、2 日など)。各時間を秒またはミリ秒単位で表すことができます。DataWeave では、構文は ​|PT1H|​ です。

P​ は、期間表現の先頭に配置する期間の指定子です。

  • Y​ は年指定子です (例: |P1Y|​)

  • M​ は月指定子です (例: |P1M|​)

  • D​ は日指定子です (例: |P1D|​)

T​ は、表現の Time コンポーネントの前に配置される時刻の指定子です。

  • H​ は時指定子です (例: |PT1H|​)

  • M​ は分指定子です (例: |PT1M|​)

  • S​ は秒指定子です (例: |PT1S|​)

DatePeriod​ は、加算や減算などの日付操作に役立ちます。
次の例は、​DatePeriod​ を使用して、ある日付から 1 年減算する方法を示しています。戻り値のデータ型は新しい ​Date​ 値です。

ソース
output application/dw
---
|2003-10-01| - |P1Y|
出力
|2002-10-01|

Duration​ は、​Date​ と ​Date​ の減算の結果として役立つため、この 2 つの日付間の時間を推定できます。
次の例は、1 つの ​Date​ 値を別の値から減算して ​Duration​ 値を返す方法を示しています。

ソース
output application/dw
---
|2003-11-01| - |2003-10-01|
出力
|PT744H|

Period の型強制

DatePeriod​ 値は日付ベースのため、​Number​ の日付ベースの単位 (​years​、​months​ など) に型強制できます。
次の例は、さまざまな単位を使用して ​DatePeriod​ 値を ​Number​ 値に型強制する方法を示しています。

ソース
output application/json
---
{
 years:  |P1Y12M| as Number {unit: "years"},
 months: |P8Y12M| as Number {unit: "months"}
}
出力
{
  "years": 2,
  "months": 108
}

Duration の型強制

Duration​ は時間ベースのため、さまざまな時間ベースの単位 (​nanos​、​milliseconds​、​seconds​、​hours​、​days​ など) を使用して、この型を ​Number​ に型強制できます。

次の例は、さまざまな単位を使用して ​Duration​ を ​Number​ に型強制する方法を示しています。

ソース
output application/json
var period = (|2010-12-10T12:10:12| - |2010-09-09T10:02:10|)
---
{
 nanos: period as Number {unit: "nanos"},
 millis: period as Number {unit: "milliseconds"},
 seconds: period as Number {unit: "seconds"},
 hours: period as Number {unit: "hours"},
 days: period as Number {unit: "days"}
}
出力
{
  "nanos": 7956482000000000,
  "millis": 7956482000,
  "seconds": 7956482,
  "hours": 2210,
  "days": 92
}

分解

Duration​ は ​hours​、​minutes​、および ​secs​ に分解できます。

次の例は、​Duration​ 値を分解する方法を示しています。

ソース
%dw 2.0
output application/json
var period = (|2010-12-10T12:10:12| - |2010-12-10T10:02:10|)
---
{
   hours:  period.hours,
   minutes:  period.minutes,
   secs:  period.secs,
}
出力
{
  "hours": 2,
  "minutes": 8,
  "secs": 2
}

Time (時刻)

特定の ​TimeZone​ 内の時刻。​|HH:mm:ss.SSS|​ として指定されます。

|23:59:56|

TimeZone

グリニッジ標準時 (GMT) を基準とする相対的な ​Time​。​TimeZone​ には ​+​ または ​-​ を含める必要があります。たとえば、​|03:00|​ は時刻ですが、​|+03:00|​ は ​TimeZone​ です。

|-08:00|

日付複合

日付の各部分にアクセスするには、特別なセレクターを使用する必要があります。

変換
%dw 2.0
output application/json
var myDate = |2003-10-01T23:57:59.700-03:00|
---
{
  year: myDate.year,
  month: myDate.month,
  day: myDate.day,
  hour: myDate.hour,
  minutes: myDate.minutes,
  seconds: myDate.seconds,
  milliseconds: myDate.milliseconds,
  nanoseconds: myDate.nanoseconds,
  quarter: myDate.quarter,
  dayOfWeek: myDate.dayOfWeek,
  dayOfYear: myDate.dayOfYear,
  offsetSeconds: myDate.offsetSeconds
}
出力
{
  "year": 2003,
  "month": 10,
  "day": 1,
  "hour": 23,
  "minutes": 57,
  "seconds": 59,
  "milliseconds": 700,
  "nanoseconds": 700000000,
  "quarter": 4,
  "dayOfWeek": 3,
  "dayOfYear": 274,
  "offsetSeconds": -10800
}

日付と時刻の形式

日付と時刻を書式設定できるようにするため、DataWeave では、日付形式 ​uuuu-MM-dd​ での ​u​ (年)、​M​、​d​ など、書式設定文字がサポートされています。これらの文字は、Java 8 の ​java.time.format​ パッケージに基づいています。

例については、​「日付と時刻の書式設定」​を参照してください。

タイムゾーン ID

タイムゾーン値 (​-07:00​ など) に加えて、DataWeave は ID (​America/Buenos_Aires​、​America/Los_Angeles​、​Asia/Tokyo​、​GMT​ など) も受け入れます。

例およびサポートされる ID のリストについては、​「タイムゾーン ID」​と​「タイムゾーンの変更」​を参照してください。

Enum (列挙) (dw::Core 型)

この型は Enum Java クラス​に基づきます。 これは、次の例で示されているように、クラスの完全な Java クラス名を指定する ​class​ プロパティと共に常に使用する必要があります。

変換
%dw 2.0
output application/java
---
"Male" as Enum {class: "com.acme.GenderEnum"}

Iterator (イテレーター) (dw::Core 型)

Iterator​ 型は、配列を反復処理する Iterator Java クラス​に基づきます。 Iterator​ には、コレクションが含まれるほか、コレクションを反復処理し、絞り込むための方法が含まれます。

Java クラスと同様に、イテレーターは 1 回のみコンシュームされるように設計されています。たとえば、ロガーがこの値をコンシュームすると、フロー内の後続の要素はこの値を参照できなくなります。

Null (dw::Core 型)

DataWeave では、​null​ 値に対して ​Null​ データ型を定義しています。​null​ は値であり、​Null​ は型であることに注意してください。DataWeave 関数は ​Null​ を ​null​ 値として認識しません。

DataWeave 関数が ​null​ 値を受け入れるかどうかを知るには、DataWeave リファレンスドキュメントを参照して Null 型を受け入れる関数シグネチャーがあるかどうかを確認します。たとえば、​flatten​ 関数には 2 つの関数シグネチャーがあり、そのうちの 1 つが ​flatten(Null): Null​ です。このシグネチャーは、​flatten​ が ​null​ 値を受け入れられることを示しています。​++​ (連結) 関数に ​Null​ 型の値を扱うシグネチャーがないため、​null​ を受け入れません。

  • flatten([[1],2,[null],null])​ は ​[1,2,null,null]​ を返します。

  • "a" ++ null​ は ​Unable to call `++` with (`String`, `Null`)​ というエラーを返します。

Number (数値) (dw::Core 型)

数値型は 1 つのみで、浮動小数点数値および整数値の両方がサポートされます。どの操作でも精度が失われることはありません。エンジンは、精度を損なわない最も効率の良い方法でデータを常に保存します。

DataWeave には、数値を書式設定し、日付と文字列を数値に型強制するメカニズムが用意されています。言語にも、数値で動作する演算子が用意されており、数値を引数として使用する多くの関数が含まれます。

  • 「DataWeave を使用した型の強制」​では、数値を書式設定する方法が示されています。

  • 「mapObject」​では、文字列を数値に型強制して数値を書式設定する例が提供されています。

  • 「​Period の型強制​」と「​Duration の型強制​」には、日付の型強制の例が含まれています。

  • 「DataWeave の演算子」​では、数値で動作する演算子について説明されています。

  • avg​ は多数の DataWeave 関数の 1 つであり、数値を受け入れます。​Number​ 型はその関数シグネチャー (​avg(Array<Number>): Number​) に含まれます。これは、関数が数値の配列を受け入れて、数値を返すことを示します。

  • Numbers​ モジュールでは、数値で動作するヘルパー関数が提供されます。

Object (オブジェクト) (dw::Core 型)

任意のオブジェクトを ​Key:value​ ペアのコレクションとして表します。​Key​ は ​Name​ と ​Attributes​ で構成されます。

Name​ 型は、ローカル名としての ​String​ と ​Namespace​ で構成されます。 Attributes​ は ​Name:value​ ペアの配列で構成されます。​Key​ は ​String​ ではないため、キーを比較することはできません。ただし、型 ​Key​ の任意の値に対して ​as String​ 型強制を実行することで、ローカル名を取得できます。

%dw 2.0
output application/json
---
{
  name: "Annie"
}

単一値オブジェクト

オブジェクトに 1 つの ​key:value​ ペアのみが含まれる場合、中括弧 ​{ }​ で囲む必要はありません。

%dw 2.0
output application/json
---
name: "Annie"

条件付き要素

オブジェクトでは、条件式に基づいて条件付きのキー-値ペアを定義できます。条件付き要素は、​(key:value) if​ 条件の形式をとります。

%dw 2.0
output application/xml encoding="UTF-8"
---
file: {
  name: "transform",
  (extension: "zip") if payload.fileSystem?
}

この例では、ペイロードに fileSystem プロパティが存在する場合のみ、「extension」と呼ばれる追加の項目が出力されます (この項目は ​true​ だけでなく任意の値を含むことができます)。

<?xml version="1.0" encoding="UTF-8"?>
<file>
  <name>transform</name>
  <extension>zip</extension>
</file>

存在しない場合:

<?xml version="1.0" encoding="UTF-8"?>
<file>
  <name>transform</name>
</file>

動的キー

式を介してキーを指定するには、括弧で式をラップする必要があります。

変換
%dw 2.0
output application/json
var dynamicKey = "language"
---
{
  (dynamicKey): "Data Weave"
}
出力
{
  "language": "Data Weave"
}

動的要素

動的要素を使用すると、式の結果をオブジェクトの ​key:value​ ペアとして追加できます。この式は ​object​ または ​array of objects​ のどちらかである必要があります。

変換
%dw 2.0
output application/json
var x = [
  {b: "b"},
  {c: "c", d: "d"}
]
var y = {e: "e"}
---
{
  a: "a",
  (x),
  (y)
}

上記のスクリプト本文中で変数を囲む​括弧​ (​(x)​ と ​(y)​) により、スクリプトの本文を囲むオブジェクトコンストラクター中括弧 (​{ }​) が変数の値に適用されます。特に、オブジェクトコンストラクター中括弧は ​x​ と ​y​ からキー-値ペアを抽出し、オブジェクト内のキー-値ペアのコレクションに変換します。括弧を使用しないと (たとえば、​(x)​ ではなく ​x​ と指定すると)、スクリプトはエラーを返します。

オブジェクトコンストラクター中括弧は、有効なオブジェクトを生成できるように、1 つ以上のキー-値ペアを含むデータコンストラクト、特にオブジェクト (例: { "a":"one", "b":"two"}​) またはオブジェクトの配列 (例: [{"a":"one"},{"b":"two"}]​) を必要とします。オブジェクトコンストラクター中括弧内では、最初の要素がキー-値ペア ​a: "a"​ であるため、オブジェクトコンストラクター中括弧は出力オブジェクトでもペアを変更せずに最初の要素として残します。ただし、オブジェクトコンストラクター中括弧は、評価される式 ​(x)​ および ​(y)​ から外側レベルのキー-値ペアを抽出して出力オブジェクトに追加します。

出力
{
  "a": "a",
  "b": "b",
  "c": "c",
  "d": "d",
  "e": "e"
}

条件付き XML 属性

条件に基づいて特定の XML 属性のみを出力に含めなければならない場合があります。条件付き要素は、​(key:value) if condition​ 条件の形式をとります。

変換
%dw 2.0
output application/xml
---
{
  name @(
    (company: "Acme") if false,
    (transform: "Anything") if true
  ): "DataWeave"
}
出力
<?xml version='1.0' encoding='US-ASCII'?>
<name transform="Anything">DataWeave</name>

動的 XML 属性

キー-値ペアの変更セットを特定の場所に XML 属性として含めなければならない場合があります。

入力
{
  "company": "Mule",
  "product": "DataWeave"
}
変換
%dw 2.0
output application/xml
---
transformation @((payload)): "Transform from anything to anything"
出力
<?xml version='1.0' encoding='US-ASCII'?>
<transformation company="Mule" product="DataWeave">Transform from anything to anything</transformation>

Regex (正規表現) (dw::Core 型)

正規表現は ​/​ の間に定義されます。たとえば、​/\d+/​ は 0 ~ 9 の複数の数字を表します。文字列に対してアクションを実行する特定の操作 (Matches、Replace など) や、オブジェクトや配列に対してアクションを実行する操作 (絞り込みなど) で、これを引数として使用できます。

String (文字列) (dw::Core 型)

二重引用符または単一引用符を使用して文字列を定義できます。

{
  doubleQuoted: "Hello",
  singleQuoted: 'Hello',
}

特殊文字のエスケープ

バックスラッシュ (​\​) を使用して、入力文字列内の特殊文字をエスケープします。

  • $​: 文字列で ​$​ が使用されている場合、エスケープする必要があります。エスケープしないと、DataWeave は ​$​ を名前のない関数パラメーターとして処理し、エラー ​Unable to resolve reference of $.​ を返します。

  • "​: 二重引用符で囲まれた文字列の場合、文字列に含まれる二重引用符をエスケープする必要があります (例: "a\"bcdef"​)。この例の 2 番目の二重引用符は、​a​ で始まり ​f​ で終わる文字列の一部です。

  • '​: 一重引用符で囲まれた文字列の場合、文字列に含まれる一重引用符をエスケープする必要があります (例: 'abcd\'e"f'​)。この例の 2 番目の一重引用符は、​a​ で始まり ​f​ で終わる文字列の一部です。 この場合、二重引用符をエスケープする必要はありません。

  • \: バッククォートで囲まれた文字列の場合、文字列に含まれるバッククォートをエスケープする必要があります (例: `​abc\​`def`​)。

  • \​: バックスラッシュは他の特殊文字をエスケープするために使用する文字列であるため、これを文字列で使用するには別のバックスラッシュでエスケープする必要があります (例: \\​)。

  • \n​: 改行を挿入します。

  • \t​: タブを挿入します。

  • \u​: Unicode 文字を挿入します (例: \u25c4​)。

文字列補間

文字列補間を使用すると、変数または式を文字列に直接埋め込むことができます。式は括弧で囲む必要があります (​$( <expression> )​)。また、式は常に String (文字列) 型を返すか、String (文字列) に強制的に変換できるものを返す必要があります。

%dw 2.0
output application/json
var name = "Shoki"
---
{
    Greeting: "Hi, my name is $name",
    Sum: "1 + 1 = $(1 + 1)"
}
出力
{
  "Greeting": "Hi, my name is Shoki",
  "Sum": "1 + 1 = 2"
}

TryResult (dw::Runtime 型)

デリゲートを評価し、結果またはエラーメッセージと共にオブジェクトを返します。​try​ の例を参照してください。成功した ​TryResult​ には ​result​ 項目と ​true​ の ​success​ 値が含まれます。失敗した ​TryResult​ には ​error​ 項目と ​false​ の ​success​ 値が含まれます。

定義
{
  success: Boolean,
  result?: T,
  error?: {
    kind: String,
    message: String,
    stack?: Array<String>,
    location?: String
  }
}

URI 型 (dw::core::URL)

URI 関数モジュール内の関数は URI データ型を返すことができます。

定義:
{
  isValid: Boolean,
  host?: String,
  authority?: String,
  fragment?: String,
  path?: String,
  port?: Number,
  query?: String,
  scheme?: String,
  user?: String,
  isAbsolute?: Boolean,
  isOpaque?: Boolean
}

URI 型は以下の項目で構成されます。

  • isValid​: URI が有効かどうかを示すブール値。無効な文字には、​<​、​>​、空白スペースがあります。

  • host​: ホスト名を表す文字列 (例: http://my.company.com:8080/hello​ の ​my.company.com​)。

  • authority​: ホストとポートを含む機関を表す文字列 (例: http://my.company.com:8080/hello​ の ​my.company.com:8080​)。URI で明示的に指定されている場合はポートのみを返します。

  • fragment​: URI の ​#​ 以降の下位リソースを表す文字列 (例: URI ​"https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#footer"​ の ​footer​)。

  • path​: ホストまたは機関の後に続くパスを表す文字列 (例: http://my.company.com:8080/hello​ の ​/hello​)。

  • port​: URI 内の明示的なポートを表す数値 (例: http://my.company.com:8080/hello​ の ​8080​)。ポートが指定されていない場合 (例: http://my.company.com/hello​)、​port​ 項目の値は ​null​ になります。

  • query​: URI のクエリ部分を識別する文字列 (例: 'http://my.company.com:1234/hello/?field=value' の ​field=value​)。

  • scheme​: コロン (​:​) の前に表示される URI スキームを識別する文字列 (​https​、​http​ など)。

  • user​: URI 内のユーザー情報を表す文字列 (例: http://myname@www.mycompany.com​ の ​myname​)。

  • isAbsolute​: URI にスキームが含まれる場合は ​true​ のブール値、URI にスキームが含まれない場合 (例: /path/to/somewhere​ などの相対 URI の場合) は ​false​。

  • isOpaque​: URI にスキームとその後に続くスラッシュ (​/​) がない場合、​true​ のブール値。 ​mailto:somebody@somewhere.com​ は ​true​ を返します。

次の DataWeave スクリプトは ​parseURI​ 関数を使用して、値を URI 型の項目に返し、値にアクセスします。​null​ 値を持つ項目 (​uriDataTypeEx​ で定義された URI など) は、明示的に選択されない限り、返されません。

DataWeave スクリプト
%dw 2.0
import * from dw::core::URL
var uriDataTypeEx = "https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#footer"
var queryStringsEx = 'http://my.company.com:1234/hello/?field=value'
output application/json
---
{
    'myUriDataTypeEx': parseURI(uriDataTypeEx),
    // queryStringsEx has a query string:
    'myQueryStringsEx': parseURI(queryStringsEx).query,
    // uriDataTypeEx lacks a query string:
    'myQueryStringNullEx': parseURI(uriDataTypeEx).query,
    // The URI includes the port number:
    'myAuthorityEx': parseURI('http://localhost:8080/test').authority
}
出力
{
  "myUriDataTypeEx": {
    "isValid": true,
    "raw": "https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#footer",
    "host": "en.wikipedia.org",
    "authority": "en.wikipedia.org",
    "fragment": "footer",
    "path": "/wiki/Uniform_Resource_Identifier",
    "scheme": "https",
    "isAbsolute": true,
    "isOpaque": false
  },
  "myQueryStringsEx": "field=value",
  "myQueryStringNullEx": null,
  "myAuthorityEx": "localhost:8080"
}