Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerDataWeave では値を使用してデータを表します。値にはそれぞれデータ型が関連付けられています。型には文字列、配列、ブール、数値、オブジェクト、日付、時刻などさまざまなものがあります。各型では、値を作成するいくつかの方法がサポートされています。このトピックでは、その多くの作成方法について説明します。 開始する前に、Mule 4 アプリケーションでは DataWeave のバージョン 2.x が使用されることに注意してください。Mule 3 アプリケーションでの DataWeave については、DataWeave バージョン 1.2 のドキュメントを参照してください。 他の Mule バージョンの場合は、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
で表され、|uuuu-MM-dd|
として指定される Date
。Date
型に Time コンポーネントはありません。
|2003-10-01|
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|
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
は時間ベースのため、さまざまな時間ベースの単位 (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
}
グリニッジ標準時 (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
パッケージに基づいています。
例については、「日付と時刻の書式設定」を参照してください。
タイムゾーン値 (-07:00
など) に加えて、DataWeave は ID (America/Buenos_Aires
、America/Los_Angeles
、Asia/Tokyo
、GMT
など) も受け入れます。
例およびサポートされる ID のリストについては、「タイムゾーン ID」と「タイムゾーンの変更」を参照してください。
この型は Enum Java クラスに基づきます。
これは、次の例で示されているように、クラスの完全な Java クラス名を指定する class
プロパティと共に常に使用する必要があります。
%dw 2.0
output application/java
---
"Male" as Enum {class: "com.acme.GenderEnum"}
Iterator
型は、配列を反復処理する Iterator Java クラスに基づきます。 Iterator
には、コレクションが含まれるほか、コレクションを反復処理し、絞り込むための方法が含まれます。
Java クラスと同様に、イテレーターは 1 回のみコンシュームされるように設計されています。たとえば、ロガーがこの値をコンシュームすると、フロー内の後続の要素はこの値を参照できなくなります。
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`)
というエラーを返します。
数値型は 1 つのみで、浮動小数点数値および整数値の両方がサポートされます。どの操作でも精度が失われることはありません。エンジンは、精度を損なわない最も効率の良い方法でデータを常に保存します。
DataWeave には、数値を書式設定し、日付と文字列を数値に型強制するメカニズムが用意されています。言語にも、数値で動作する演算子が用意されており、数値を引数として使用する多くの関数が含まれます。
「DataWeave を使用した型の強制」では、数値を書式設定する方法が示されています。
「mapObject」では、文字列を数値に型強制して数値を書式設定する例が提供されています。
「Period の型強制」と「Duration の型強制」には、日付の型強制の例が含まれています。
「DataWeave の演算子」では、数値で動作する演算子について説明されています。
avg は多数の DataWeave 関数の 1 つであり、数値を受け入れます。Number
型はその関数シグネチャー (avg(Array<Number>): Number
) に含まれます。これは、関数が数値の配列を受け入れて、数値を返すことを示します。
Numbers モジュールでは、数値で動作するヘルパー関数が提供されます。
任意のオブジェクトを 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 属性のみを出力に含めなければならない場合があります。条件付き要素は、(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 属性として含めなければならない場合があります。
{
"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',
}
バックスラッシュ (\
) を使用して、入力文字列内の特殊文字をエスケープします。
$
: 文字列で $
が使用されている場合、エスケープする必要があります。エスケープしないと、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"
}
デリゲートを評価し、結果またはエラーメッセージと共にオブジェクトを返します。try
の例を参照してください。成功した TryResult
には result
項目と true
の success
値が含まれます。失敗した TryResult
には error
項目と false
の success
値が含まれます。
{
success: Boolean,
result?: T,
error?: {
kind: String,
message: String,
stack?: Array<String>,
location?: String
}
}
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 など) は、明示的に選択されない限り、返されません。
%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"
}