Flex Gateway新着情報
Governance新着情報
Monitoring API Manager
DataWeave 2.1 は Mule 4.1 と互換性があります。 Mule 4.1 の標準サポートは 2020 年 11 月 2 日に終了しました。このバージョンの Mule は、拡張サポートが終了する 2022 年 11 月 2 日にそのすべてのサポートが終了します。 このバージョンの Mule を使用する CloudHub には新しいアプリケーションをデプロイできなくなります。許可されるのはアプリケーションへのインプレース更新のみになります。 標準サポートが適用されている最新バージョンの Mule 4 にアップグレードすることをお勧めします。これにより、最新の修正とセキュリティ機能強化を備えたアプリケーションが実行されます。 |
DataWeave は、配列、ブール、オブジェクト、日付、日時を含め、さまざまな型のデータで動作します。DataWeave が提供する型はモジュールにバンドルされ、モジュールにも、関連する関数が含まれます。
dw::Core
モジュール内の型 (Core 型) は、Core モジュールをインポートしなくても使用できます。他のモジュールについては、モジュールをインポートしてその関数と型を使用できるようにする必要があります。
このトピックでは、以下を含め、いくつかの DataWeave 型の概要および一般的なパターンについて説明します。
配列には、サポートされるすべての型の要素を保持できます。配列の例を次に示します。
%dw 2.0
output application/json
var x = "words"
---
[ "My", "three", x ]
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>
DataWeave の日付は ISO-8601 標準に従い、リテラルは |
文字の間に定義されます。
この言語には次のネイティブの日付型があります。
Date
DateTime
LocalDateTime
LocalTime
Period
Time
TimeZone
Year
、Month
、および Day
で表され、|yyyy-MM-dd|
として指定される Date
。Date
型に Time コンポーネントはありません。
|2003-10-01|
期間には次の形式があります。
P[n]Y[n]M[n]DT[n]H[n]M[n]S
P<date>T<time>`
[n] は、[n] の後の各日時要素の値で置き換えられます。
P
は、期間表現の先頭に配置する期間の指定子です。
Y
は年指定子です (例: |P1Y|
)
M
は月指定子です (例: |P1M|
)
D
は日指定子です (例: |P1D|
)
T
は、表現の Time コンポーネントの前に配置される時刻の指定子です。
H
は時指定子です (例: |PT1H|
)
M
は分指定子です (例: |PT1M|
)
S
は秒指定子です (例: |PT1S|
)
%dw 2.0
output application/json
---
a: |20:00:00| + |PT1M1S|
{
"a": "20:01:01"
}
グリニッジ標準時 (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 では、Java 8 java.time.format
パッケージに基づくいくつかの書式設定文字 (日付形式 yyyy-MM-dd
の y
、M
、d
など) がサポートされます。次の例は、サポートされる文字を表示するように now
DataWeave 関数の出力を書式設定しています。
%dw 2.0
output application/json
---
[
{ "dateTime" : now() },
{ "era-G" : now() as String { format: "G"} },
{ "year-u" : now() as String {format: "u"} },
{ "year-uu" : now() as String {format: "uu"} },
{ "year-y" : now() as String { format: "y"} },
{ "year-yy" : now() as String { format: "yy"} },
{ "dayOfYear-D" : now() as String { format: "D"} },
{ "monthOfYear-MMMM": now() as String { format: "MMMM"} },
{ "monthOfYear-MMM": now() as String { format: "MMM"} },
{ "monthOfYear-MM": now() as String { format: "MM"} },
{ "monthOfYear-M": now() as String { format: "M"} },
{ "monthOfYear-LL": now() as String { format: "LL"} },
{ "monthOfYear-L": now() as String { format: "L"} },
{ "dayOfMonth-d" : now() as String {format: "d"} },
{ "quarterOfYear-qqq" : now() as String {format: "qqq"} },
{ "quarterOfYear-qq" : now() as String {format: "qq"} },
{ "quarterOfYear-q" : now() as String {format: "q"} },
{ "quarterOfYear-QQQQ" : now() as String {format: "QQQQ"} },
{ "quarterOfYear-QQQ" : now() as String {format: "QQQ"} },
{ "quarterOfYear-QQ" : now() as String {format: "QQ"} },
{ "quarterOfYear-Q" : now() as String {format: "Q"} },
// Understand "Y" and "YY" thoroughly before using it.
{ "weekBasedYear-YY" : now() as String { format: "YY"} },
{ "weekBasedYear-Y" : now() as String { format: "Y"} },
{ "weekInYear-w" : now() as String {format: "w"} },
{ "weekInMonth-W" : now() as String {format: "W"} },
{ "dayOfWeekAbbreviatedName-E" : now() as String {format: "E"} },
{ "dayOfWeekFullName-EEEE" : now() as String {format: "EEEE"} },
{ "localizedDayOfWeek-eeee" : now() as String {format: "eeee"} },
{ "localizedDayOfWeek-eee" : now() as String {format: "eee"} },
{ "localizedDayOfWeek-ee" : now() as String {format: "ee"} },
{ "localizedDayOfWeek-e" : now() as String {format: "e"} },
{ "localizedDayOfWeek-cccc" : now() as String {format: "cccc"} },
{ "localizedDayOfWeek-ccc" : now() as String {format: "ccc"} },
{ "localizedDayOfWeek-c" : now() as String {format: "c"} },
{ "weekOfMonth-F" : now() as String {format: "F"} },
{ "amORpm-a" : now() as String {format: "a"} },
// "h" outputs 12 o'clock as 12. Other hours match "K" output.
{ "hourOfDay1to12-h" : now() as String {format: "h"} },
// "K" outputs 12 o'clock as 0. Other hours match "h" output.
{ "hourOfDay0to11-K" : now() as String {format: "K"} },
{ "clockHourOfAmPm-k" : now() as String {format: "k"} },
{ "hourOfDay0to23-H" : now() as String {format: "H"} },
{ "minuteOfHour-m" : now() as String {format: "m"} },
{ "secondOfMinute-s" : now() as String {format: "s"} },
{ "fractionOfSecond-S" : now() as String {format: "S"} },
{ "millisecondOfDay-A" : now() as String {format: "A"} },
{ "nanosecondCountOfSecond-n" : now() as String {format: "n"} },
{ "nanosecondCountOfDay-N" : now() as String {format: "N"} },
{ "timeZoneID-VV" : now() as String {format: "VV"} },
{ "timeZoneName-zz" : now() as String {format: "zz"} },
{ "localizedZoneOffset-OOOO" : now() as String {format: "OOOO"} },
{ "localizedZoneOffset-O" : now() as String {format: "O"} },
{ "timeZoneOffsetZforZero-XXX" : now() as String {format: "XXX"} },
{ "timeZoneOffsetZforZero-XX" : now() as String {format: "XX"} },
{ "timeZoneOffsetZforZero-X" : now() as String {format: "X"} },
{ "timeZoneOffset-xxx" : now() as String {format: "xxx"} },
{ "timeZoneOffset-xx" : now() as String {format: "xx"} },
{ "timeZoneOffset-x" : now() as String {format: "x"} },
{ "timeZoneOffset-Z" : now() as String {format: "Z"} },
{ "timeZoneOffset-ZZZZ" : now() as String {format: "ZZZZ"} }
]
日付または時刻を書式設定するための構文の使用方法を参照してください。
[ { "dateTime": "2019-04-10T14:20:14.271-07:00" }, { "era-G": "AD" }, { "year-u": "2019" }, { "year-uu": "19" }, { "year-y": "2019" }, { "year-yy": "19" }, { "dayOfYear-D": "100" }, { "monthOfYear-MMMM": "April" }, { "monthOfYear-MMM": "Apr" }, { "monthOfYear-MM": "04" }, { "monthOfYear-M": "4" }, { "monthOfYear-LL": "04" }, { "monthOfYear-L": "4" }, { "dayOfMonth-d": "10" }, { "quarterOfYear-qqq": "2" }, { "quarterOfYear-qq": "02" }, { "quarterOfYear-q": "2" }, { "quarterOfYear-QQQQ": "2nd quarter" }, { "quarterOfYear-QQQ": "Q2" }, { "quarterOfYear-QQ": "02" }, { "quarterOfYear-Q": "2" }, { "weekBasedYear-YY": "19" }, { "weekBasedYear-Y": "2019" }, { "weekInYear-w": "15" }, { "weekInMonth-W": "2" }, { "dayOfWeekAbbreviatedName-E": "Wed" }, { "dayOfWeekFullName-EEEE": "Wednesday" }, { "localizedDayOfWeek-eeee": "Wednesday" }, { "localizedDayOfWeek-eee": "Wed" }, { "localizedDayOfWeek-ee": "04" }, { "localizedDayOfWeek-e": "4" }, { "localizedDayOfWeek-cccc": "Wednesday" }, { "localizedDayOfWeek-ccc": "Wed" }, { "localizedDayOfWeek-c": "4" }, { "weekOfMonth-F": "3" }, { "amORpm-a": "PM" }, { "hourOfDay1to12-h": "2" }, { "hourOfDay0to11-K": "2" }, { "clockHourOfAmPm-k": "14" }, { "hourOfDay0to23-H": "14" }, { "minuteOfHour-m": "20" }, { "secondOfMinute-s": "14" }, { "fractionOfSecond-S": "2" }, { "millisecondOfDay-A": "51614271" }, { "nanosecondCountOfSecond-n": "271000000" }, { "nanosecondCountOfDay-N": "51614271000000" }, { "timeZoneID-VV": "America/Los_Angeles" }, { "timeZoneName-zz": "PDT" }, { "localizedZoneOffset-OOOO": "GMT-07:00" }, { "localizedZoneOffset-O": "GMT-7" }, { "timeZoneOffsetZforZero-XXX": "-07:00" }, { "timeZoneOffsetZforZero-XX": "-0700" }, { "timeZoneOffsetZforZero-X": "-07" }, { "timeZoneOffset-xxx": "-07:00" }, { "timeZoneOffset-xx": "-0700" }, { "timeZoneOffset-x": "-07" }, { "timeZoneOffset-Z": "-0700" }, { "timeZoneOffset-ZZZZ": "GMT-07:00" } ]
以下の方法で as
を使用して書式設定文字を組み合わせることで、サポートされる日付と時刻の形式を文字列に書き込むことができます。
%dw 2.0
output application/json
---
formattedDate: |2003-10-01T23:57:59| as String {format: "yyyy-MM-dd"}
{ "formattedDate": "2003-10-01" }
スクリプトで複数の似た変換を実行する場合、ヘッダーでカスタム型をディレクティブとして定義し、各日付をその型に設定することをお勧めします。
%dw 2.0
output application/json
type Mydate = String { format: "yyyy/MM/dd" }
---
{
formattedDate1: |2003-10-01T23:57:59| as Mydate,
formattedDate2: |2015-07-06T08:53:15| as Mydate
}
{
"formattedDate1": "2003/10/01",
"formattedDate2": "2015/07/06"
}
型名は大文字と小文字を区別します。
この型は Enum Java クラスに基づきます。
これは、次の例で示されているように、クラスの完全な Java クラス名を指定する class
プロパティと共に常に使用する必要があります。
%dw 2.0
output application/java
---
"Male" as Enum {class: "com.acme.GenderEnum"}
Iterator
型は、配列を反復処理する Iterator Java クラスに基づきます。 Iterator
には、コレクションが含まれるほか、コレクションを反復処理し、絞り込むための方法が含まれます。
Java クラスと同様に、イテレータは 1 回のみコンシュームされるように設計されています。たとえば、この値をロガーに渡すと、値がコンシュームされ、フロー内の以降の要素でこの値を読み取れなくなります。
浮動小数点数値および整数値の両方をサポートする 1 つの数値型のみがあります。どの操作でも精度が失われることはありません。エンジンは、精度を損なわない最も効率の良い方法でデータを常に保存します。
任意のオブジェクトを key:value
ペアとして表します。
%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)
など。x
はヘッダーに表示される変数) はオブジェクトの配列を返す必要があることに注意することが重要です。この配列内のすべてのオブジェクトがマージされます。これらのオブジェクトは、含まれているオブジェクトともマージされます。出力は次のようになります。
{
"a": "a",
"b": "b",
"c": "c",
"d": "d",
"e": "e"
}
条件に基づいて特定の XML 属性のみを出力に含めなければならない場合があります。条件付き要素は、「(key:value) if」条件の形式をとります。
%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 属性として含めなければならない場合があります。
{
"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>
正規表現は /
の間に定義されます。たとえば、/\d+/
は 0 ~ 9 の複数の数字を表します。文字列に対してアクションを実行する特定の操作 (Matches、Replace など) や、オブジェクトや配列に対してアクションを実行する操作 (絞り込みなど) で、これを引数として使用できます。
二重引用符または単一引用符を使用して文字列を定義できます。
{
doubleQuoted: "Hello",
singleQuoted: 'Hello',
}
文字列補間を使用すると、変数または式を文字列に直接埋め込むことができます。式は括弧で囲む必要があります ($( <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"
}
デリゲートを評価し、結果またはエラーメッセージと共にオブジェクトを返します。try
の例を参照してください。成功した TryResult
には result
項目と true
の success
値が含まれます。失敗した TryResult
には error
項目と false
の success
値が含まれます。
{
success: Boolean,
result?: T,
error?: {
kind: String,
message: String,
stack?: Array<String>,
location?: String
}
}
データ型の詳細に関するドキュメントは、モジュールリファレンスページで見つけることができます。