リーダーとライターの設定プロパティの設定

DataWeave では、JSON (​application/json​)、XML (​application/xml​)、(​application/csv​) などのデータ形式の設定プロパティが提供されます。このプロパティでこれらの形式の DataWeave リーダーおよびライターの動作を変更します。たとえば、CSV リーダーのデフォルトの区切り文字はカンマ (​,​) です。この形式の ​separator​ プロパティを使用して、CSV コンテンツの別の区切り文字を指定できます。

開始する前に、DataWeave 2.0 (%dw 2.0​) は Mule 4 アプリケーションを対象とすることに注意してください。Mule 3 アプリケーションの場合、Mule 3.9 ドキュメントセットの DataWeave 1.0 (%dw 1.0​) の例を参照してください。他の Mule バージョンの場合は、目次の Mule Runtime バージョンセレクタを使用できます。

出力ディレクティブでのライタープロパティの使用

次の例は、ライタープロパティを DataWeave ​output​ ディレクティブに追加する方法を示しています。このスクリプトでは、​indent = false​ を使用して JSON 出力を 1 行に圧縮します。

DataWeave スクリプト:
%dw 2.0
output application/json indent = false
---
{
	hello : "world",
	bello : "world",
	mello : "world"
}
出力 JSON:
{"hello": "world","bello": "world","mello": "world"}

次の例でも、ライター設定プロパティを ​output​ ディレクティブに追加しています。

DataWeave 関数でのリーダーとライターのプロパティの使用

DataWeave の ​read​、​readUrl​、および ​write​ 関数は、中括弧内の 1 つ以上のカンマ区切りプロパティ設定を受け入れます。

次のスクリプトのヘッダーの ​myVar​ の値は、空の子要素 (​<ex1></ex1>​) を含む XML サンプルを入力する ​read​ 関数です。この関数は、空の要素の値を ​null​ に変換する XML リーダープロパティ ​{nullValueOn: "empty"}​ を渡します。

スクリプトの本文の ​write​ 関数は ​myVar​ の値を入力として受け入れます。この関数では、JSON ライタープロパティを ​{skipNullOn:"objects", writeAttributes:true}​ に渡して、​null​ 値 (​<ex1>null</ex1>​) を含むオブジェクトをスキップし、属性と ​<ex3 a='greeting'>hello</ex3>​ の値を書き込みます。

DataWeave スクリプト:
%dw 2.0
var myVar = read("<greeting><ex1></ex1><ex2>hello</ex2><ex3 a='greeting'>hello</ex3></greeting>", "application/xml", {nullValueOn: "empty"})
output application/json with binary
---
write(myVar.greeting, "application/json", {skipNullOn:"objects", writeAttributes:true})
出力 JSON:
{
  "ex2": "hello",
  "ex3": {
    "@a": "greeting",
    "__text": "hello"
  }
}

リーダープロパティを ​readUrl​ に渡す例を次に示します。

コネクタ操作を介したリーダープロパティの使用

入力データを読み取るコネクタ操作では、​入力​ MIME タイプを識別するために使用できる ​outpuMimeType​ 項目が提供されます。この項目は、DataWeave で入力を正確に読み取るのに役立つ 1 つ以上のリーダープロパティも受け入れます。

デフォルトでは、DataWeave リーダーではカンマ (​,​) が区切り文字として処理されます。ただし、CSV 入力がパイプ (​|​) で区切られており、コンテンツにカンマも含まれている場合は、パイプを区切り文字として認識するように CSV リーダープロパティを設定できます。

パイプ区切りの CSV 入力
id | name | role
1234 | Shokida,Mr. | dev
2345 | Achaval,Mr. | arch
3456 | Felisatti,Ms. | mngr
4567 | Chibana,Mr. | dev

次の例では、ファイルコネクタで Read 操作を使用してパイプ区切り (​|​) の CSV 入力を読み取り、Transform Message コンポーネントで DataWeave スクリプトを使用して入力の行をカンマ区切り形式で出力します。

Mule フロー:
<flow name="ex-use-csv-reader-props" >
	<scheduler doc:name="Scheduler" >
		<scheduling-strategy >
			<fixed-frequency frequency="90" timeUnit="SECONDS"/>
		</scheduling-strategy>
	</scheduler>
	<file:read doc:name="Read" config-ref="File_Config" path="staff.csv"
	           outputMimeType='application/csv; separator=|; header=true'/>
	<ee:transform doc:name="Transform Message" >
		<ee:message>
			<ee:set-payload><![CDATA[%dw 2.0
output application/csv header = false
---
payload[1]]]></ee:set-payload>
		</ee:message>
	</ee:transform>
	<logger level="INFO" doc:name="Logger" message="#[payload]"/>
</flow>

例の Scheduler コンポーネント (​<scheduler/>​) では、フローをトリガするたびに Mule イベントを生成します。

Read 操作 (​<file:read/>​) では、​outputMimeType='application/csv; separator=|; header=true'​ を使用して、入力 MIME タイプ (​application/csv​)、CSV 区切り文字 (​|​)、ヘッダー設定 (​true​) を識別します。

Transform Message コンポーネント (​<ee:transform-message/>​) のスクリプトでは、入力 CSV から 2 番目の行 (​2345 , Achaval\,Mr. , arch​) が返されます。DataWeave では CSV の各行が配列のインデックスとして処理されるため、このスクリプトでは ​payload[1]​ を使用してこの行を選択します。デフォルトの CSV 区切り文字はカンマのため、出力はカンマで区切られています。このスクリプトでは、​output​ ディレクティブ (​output application/csv header = false​) を使用して出力から CSV ヘッダーを除外します。

payload​ に設定された Logger コンポーネント (​<logger/>​) では、カンマ区切りの出力を INFO としてその ​LoggerMessageProcessor​ メッセージに書き込みます: 2345 , Achaval\,Mr. , arch​。. 「Mr.」の前のカンマが区切り文字として処理されないように、CSV 出力ではこのカンマがバックスラッシュでエスケープされています (​Achaval\,Mr.​)。

outputMimeType​ 項目を介してリーダープロパティを渡す例を次に示します。

  • streaming=true; header=true​ を使用する ​CSV の例

  • streaming=true​ を使用する ​JSON の例

設定値としての Mule 変数の使用

次の Mule フローでは、カンマ区切りの CSV データをパイプ区切り (​|​) の CSV データに変換します。スクリプトでリテラル値を設定する代わりに、この例では、フロー内のデータ処理コンポーネントを通過する Mule イベントの一部である ​Mule 変数​からパイプ値を選択しています。

例の Scheduler コンポーネント (​<scheduler/>​) では、フローをトリガするたびに Mule イベントを生成します。

Set Variable コンポーネント (​<set-variable/>​) では、値 ​'|'​ を含む ​delimiter​ という名前の Mule 変数を作成します。. Studio では、値は単純な文字列 (​value="'|'"​) ではなく ​fx​ 式 (​value="#['|']"​) として作成されます。

Transform Message コンポーネント (​<ee:transform-message/>​) には、カンマ区切りの CSV 入力を読み取り、Mule 変数を使用してパイプ区切りの CSV 出力を書き込む DataWeave スクリプトが含まれます。

payload​ に設定された Logger コンポーネント (​<logger/>​) では、パイプ区切りの出力を INFO としてその ​LoggerMessageProcessor​ メッセージに書き込みます: macaroni | rigatoni | ravioli | spaghetti​。

Mule フロー:
<flow name="ex-use-mule-var-as-prop-config-val" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="45" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <set-variable value="#['|']" doc:name="Set Variable" variableName="delimiter" />
  <ee:transform doc:name="Transform Message" >
    <ee:message>
      <ee:set-payload><![CDATA[%dw 2.0
var myVar = read("macaroni , rigatoni , ravioli , spaghetti", "application/csv" , {"header":false, separator:','})
output application/csv with binary
---
write(myVar, "application/csv", {"header":false, "separator":vars.delimiter})]]></ee:set-payload>
    </ee:message>
  </ee:transform>
  <logger level="INFO" doc:name="Logger" message="#[payload]"/>
</flow>

例のカンマ区切り入力を提供するため、Transform Message コンポーネントのスクリプトでは、​read​ 関数を DataWeave 変数 (​myVar​) への値として使用します:

var myVar = read("macaroni , rigatoni , ravioli , spaghetti", "application/csv" , {"header":false, separator:','})

パイプ区切りの出力を書き込むため、スクリプト本文の DataWeave ​write​ 関数では、カンマ区切りの入力をパイプ区切りの出力に変更します。Mule 変数 (​delimiter​) からパイプ値を選択するため、この関数ではライタープロパティ設定 ​"separator":vars.delimiter​ を引数として渡します:

write(myVar, "application/csv", {"header":false, "separator":vars.delimiter})

スクリプトでは、​output application/csv with binary​ の DataWeave ​output​ ディレクティブをスクリプトのヘッダーで使用しています。. write​ 関数で CSV 出力が返されたため、​with binary​ 設定 (​Mule 4.3.0 で導入済み​) を追加してバイナリライターを呼び出す必要があります。この設定がないと、DataWeave は CSV を再度書き込もうとするため、​CSV Structure should be an Array<Object> or Object but got String, while writing CSV.​ の問題が発生します。

Studio UI で Tranform Message コンポーネントの ​[Preview (プレビュー)]​ 画面からパイプ区切りのコンテンツを表示する場合は、そのサンプルデータを作成する必要があります。

  1. Studio アプリケーションの ​[Message Flow (メッセージフロー)]​ 領域から [Transform Message] コンポーネントをダブルクリックします。

  2. [Context (コンテキスト)]​ タブの ​[delimiter: String]​ を右クリックします。これは、コンポーネントの設定 UI の左下にあります。

  3. [Edit Sample Data (サンプルデータの編集)]​ を選択して、​[vars-delimiter]​ タブを開きます。

  4. vars-delimiter​ のすべてのコンテンツを ​delimiter​ 値の次のサンプルデータで置き換えます: "|"​。. 区切り文字は引用符で囲む必要があります。

サンプルデータについての追加の指標は、​「変換出力のプレビュー」​を参照してください。

Was this article helpful?

💙 Thanks for your feedback!