<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dataweave | ビズドットオンライン</title>
	<atom:link href="https://it-biz.online/tag/dataweave/feed/" rel="self" type="application/rss+xml" />
	<link>https://it-biz.online</link>
	<description></description>
	<lastBuildDate>Mon, 03 Feb 2025 08:07:15 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://it-biz.online/wp-content/uploads/2019/10/cropped-4a332f05ade4ac7bb3c46c472cb5eac8-32x32.png</url>
	<title>Dataweave | ビズドットオンライン</title>
	<link>https://it-biz.online</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DataWeaveとは？１０分で速習する完全ガイド</title>
		<link>https://it-biz.online/mulesoft/dataweave-abc/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 21 Jan 2025 04:29:29 +0000</pubDate>
				<category><![CDATA[MuleSoft]]></category>
		<category><![CDATA[Dataweave]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9594</guid>

					<description><![CDATA[DataWeave は、MuleSoft（参考 MuleSoftとは？）が提供するデータ変換とスクリプト言語です。Mule 4（Anypoint Platformを含む）環境では標準で組み込まれており、JSON、XML、 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>DataWeave</strong> は、MuleSoft（<span class="badge">参考</span> <a href="https://it-biz.online/mulesoft/mulesoft-abc/">MuleSoftとは？</a>）が提供する<strong>データ変換</strong>と<strong>スクリプト言語</strong>です。Mule 4（Anypoint Platformを含む）環境では標準で組み込まれており、JSON、XML、CSV、Javaオブジェクト、さらには複数のフォーマットに対して柔軟かつ便利な変換機能を提供します。</p>



<p>MuleSoftでは、このDataWeaveをうまく活用することで様々な処理を実現することが可能になります。</p>



<p>とはいえ、<strong><span class="marker-under">Dataweaveを集中的に学ぶ機会も限られているのが現実</span></strong>。そこでこのページでは、Dataweaveとは何か？から始め、Dataweaveを利用した簡単なコーディング（少なくともコードを読むことができる）が可能になるようにDataweaveの構文ルールを１からわかりやすく解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">DataWeaveの特徴</a></li><li><a href="#toc2" tabindex="0">DataWeaveの基本構文</a><ol><li><a href="#toc3" tabindex="0">DataWeaveスクリプトの基本構造</a></li><li><a href="#toc4" tabindex="0">Script Header の各種オプション</a></li><li><a href="#toc5" tabindex="0">コメント</a></li></ol></li><li><a href="#toc6" tabindex="0">データ型とリテラル</a><ol><li><a href="#toc7" tabindex="0">スカラー型</a></li><li><a href="#toc8" tabindex="0">配列 (Array)</a></li><li><a href="#toc9" tabindex="0">オブジェクト (Object)</a></li><li><a href="#toc10" tabindex="0">Date/Time型</a></li></ol></li><li><a href="#toc11" tabindex="0">変数と命名</a><ol><li><a href="#toc12" tabindex="0">変数宣言</a></li><li><a href="#toc13" tabindex="0">letブロック内での変数宣言</a></li></ol></li><li><a href="#toc14" tabindex="0">関数</a><ol><li><a href="#toc15" tabindex="0">関数の定義</a></li><li><a href="#toc16" tabindex="0">引数の型指定</a></li><li><a href="#toc17" tabindex="0">ローカル関数とグローバル関数</a></li></ol></li><li><a href="#toc18" tabindex="0">条件分岐とパターンマッチ</a><ol><li><a href="#toc19" tabindex="0">if ... else</a></li><li><a href="#toc20" tabindex="0">match演算子(パターンマッチ)</a></li></ol></li><li><a href="#toc21" tabindex="0">イテレーションと高階関数</a><ol><li><a href="#toc22" tabindex="0">map</a></li><li><a href="#toc23" tabindex="0">filter</a></li><li><a href="#toc24" tabindex="0">reduce</a></li><li><a href="#toc25" tabindex="0">その他の高階関数</a></li></ol></li><li><a href="#toc26" tabindex="0">主要な演算子・機能</a><ol><li><a href="#toc27" tabindex="0">オブジェクトのスプレッド・結合</a></li><li><a href="#toc28" tabindex="0">オブジェクトの破壊的パターン(Destructuring)</a></li><li><a href="#toc29" tabindex="0">when ... otherwiseによる条件生成</a></li></ol></li><li><a href="#toc30" tabindex="0">各種フォーマットの入出力</a><ol><li><a href="#toc31" tabindex="0">JSONの読み書き</a></li><li><a href="#toc32" tabindex="0">XMLの読み書き</a></li><li><a href="#toc33" tabindex="0">CSVの読み書き</a></li><li><a href="#toc34" tabindex="0">その他の形式</a></li></ol></li><li><a href="#toc35" tabindex="0">モジュールと拡張機能</a><ol><li><a href="#toc36" tabindex="0">モジュールのインポート</a></li><li><a href="#toc37" tabindex="0">関数のエイリアス</a></li><li><a href="#toc38" tabindex="0">有名な組み込みモジュール例</a></li></ol></li><li><a href="#toc39" tabindex="0">DataWeave 2.0でのよく使う式の実例</a><ol><li><a href="#toc40" tabindex="0">JSON -&gt; JSONの変換例</a></li><li><a href="#toc41" tabindex="0">JSON -&gt; CSVの変換例</a></li><li><a href="#toc42" tabindex="0">XML -&gt; JSONの変換例</a></li><li><a href="#toc43" tabindex="0">名前空間 (Namespace) の扱い (主にXML)</a></li><li><a href="#toc44" tabindex="0">変換フロー内でのattributesの利用</a></li><li><a href="#toc45" tabindex="0">スクリプトのモジュール化・再利用</a></li><li><a href="#toc46" tabindex="0">関数型プログラミングの活用</a></li><li><a href="#toc47" tabindex="0">ストリーミング</a></li></ol></li><li><a href="#toc48" tabindex="0">ベストプラクティス</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">DataWeaveの特徴</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>まずは、簡単にDataWeaveの特徴をお示しします。</p>
</div></div>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>宣言的（Declarative）なスタイル</strong><br>従来の命令型スタイル（if/for/whileなど逐次処理）とは異なり、「入力データをどのように出力データへマッピングするか」を宣言的に書くことで、表現力豊かなデータ変換を少ないコード量で実現します。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>各種データ形式に対応</strong><br>JSON、XML、CSV、Javaオブジェクト、YAMLなど、多様な形式との相互変換に対応します。Mule Flow内では<code><span class="blue">transform</span></code>コンポーネントでDataWeaveスクリプトを記述し、入力から出力への変換を定義します。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>関数型言語としての特性</strong><br>DataWeaveは変換を行うために<strong>関数型言語</strong>の要素を取り入れており、副作用が少なくテスト可能で読みやすいコードを書くのに適しています。</li>



<li><strong>Mule 4以降でメイン言語として利用</strong><br>Mule 3まではMule Expression Language (MEL)とDataWeave 1.0の2本立てでしたが、Mule 4以降はDataWeave 2.0がメイン。大幅に強化された機能が用意されています。</li>
</ol>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">Transformコンポーネントとは・・・？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>MuleSoftのフローで<strong>データ変換を実行するためのコンポーネント</strong>です。主に以下の役割を果たします。</p>



<ol class="wp-block-list">
<li><strong>データフォーマットの変換</strong><br>JSON、XML、CSV、Javaオブジェクトなど、異なる形式間の変換を行います。</li>



<li><strong>DataWeaveスクリプトの実行</strong><br>Transformコンポーネント内でDataWeaveを使い、データを柔軟に加工・整形します。</li>



<li><strong>入力と出力のマッピング</strong><br>フロー内のペイロード（<code>payload</code>）や属性（<code>attributes</code>）を操作し、次の処理へ渡すデータを定義します。</li>
</ol>
</div></dd></dl></div>



<h2 class="wp-block-heading"><span id="toc2">DataWeaveの基本構文</span></h2>



<h3 class="wp-block-heading"><span id="toc3">DataWeaveスクリプトの基本構造</span></h3>



<p>DataWeaveスクリプトは大きく以下の3つのセクションで構成されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
payload
</pre>



<ol class="wp-block-list">
<li><strong>宣言セクション(Directive)</strong><br><code><span class="blue">%%dw 2.0</span></code>のようにバージョンを示します。また必要に応じて<code><span class="blue">import</span></code>等（※後述）を記述します。</li>



<li><strong>出力形式(Output)の指定</strong><br><code><span class="blue">output application/json</span></code>など（※後述）で、変換結果のメディアタイプを指定します。</li>



<li><strong>変換式(Body)本体</strong><br><code><span class="blue">---</span></code>の後に<strong>変換処理</strong>を記述します。ここに式（<strong>式言語</strong>）を書いていきます。</li>
</ol>



<p class="has-text-align-center"><span class="badge-blue">サンプルコード</span>　<strong>最もシンプルな例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
payload
</pre>



<p>上記の場合、入力（<code>payload</code>）がそのままJSONとして出力されます。</p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-hint block-box">
<p class="has-text-align-center"><strong>Dataweaveのバージョンについて</strong></p>



<p><strong>DataWeave 1.0</strong>:</p>



<ul class="wp-block-list">
<li>Mule 3で導入されたバージョン。</li>



<li><strong>構文が異なる</strong>: 1.0では少し冗長で、2.0ほどの柔軟性がありません。</li>



<li><code>output application/json ---</code> などのセクション構成は似ていますが、詳細な書き方に差異があります。</li>
</ul>



<p><strong>DataWeave 2.0</strong>:</p>



<ul class="wp-block-list">
<li>Mule 4で採用。<strong><span class="marker-under">現在の主要バージョン。</span></strong></li>



<li><strong>機能強化</strong>: より宣言的なスタイル、追加の高階関数（<code>flatMap</code>や<code>reduce</code>など）、モジュールの柔軟な利用。</li>



<li><strong>JSON、XML、CSV、Javaオブジェクトなどのフォーマット間変換が簡易化</strong>。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Mule 4を使用する場合、<strong>DataWeave 2.0</strong>がデフォルトで使われます。1.0はMule 3専用のため、2.0を学習・利用するのが推奨されます。</p>
</div></div>
</div>



<h3 class="wp-block-heading"><span id="toc4">Script Header の各種オプション</span></h3>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin"><code><span class="blue">output application/json skipNullOn="everywhere"</span></code><br>Nullを出力から除外するといった細かいオプション指定が可能です。</li>



<li><code><span class="blue">output application/xml indent="true"</span></code><br>XML出力を整形するなど、各種メディアタイプに応じたオプション設定ができます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">コメント</span></h3>



<ul class="wp-block-list">
<li>行コメント： <code>// ここはコメント</code></li>



<li>ブロックコメント： <code>/* ここはブロックコメント */</code></li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
/* 
  ブロックコメント: 
  以下では、サンプルデータの操作と
  コメントの使い方を示します。
*/

var sampleData = [1, 2, 3, 4, 5] // 行コメント: 配列データを定義

{
    // 配列の要素を2倍にする
    doubledValues: sampleData map (item) -> item * 2,
    
    /* 条件に基づくフィルタリング:
       2倍した値が6以上の場合のみ取得 */
    filteredValues: sampleData
        map (item) -> item * 2 // 要素を2倍
        filter (item) -> item >= 6, // フィルタリング
    
    // 結果の概要
    summary: {
        originalSize: sizeOf(sampleData), // 元のデータの要素数
        filteredSize: sizeOf(sampleData filter (item) -> item * 2 >= 6) // フィルタリング後の要素数
    }
}
</pre>



<h2 class="wp-block-heading"><span id="toc6">データ型とリテラル</span></h2>



<p>DataWeaveで扱える代表的な型・リテラルは以下の通りです。</p>



<h3 class="wp-block-heading"><span id="toc7">スカラー型</span></h3>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">スカラー型とは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p><strong>単一の値を表すデータ型</strong>のこと。複雑な構造を持つ配列やオブジェクトとは異なり、<strong>最小単位のデータ型</strong>と考えればOK。</p>
</div></dd></dl></div>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    stringExample: "Hello, DataWeave", // String
    numberExample: 123,                // Number
    booleanExample: true,              // Boolean
    nullExample: null,                 // Null
    dateExample: |2023-01-01|          // Date
}
</pre>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table class="has-fixed-layout"><thead><tr><th>スカラー型</th><th>説明</th><th>サンプル</th></tr></thead><tbody><tr><td><strong>String</strong></td><td>文字列型</td><td><code>"Hello"</code></td></tr><tr><td><strong>Number</strong></td><td>数値型（整数・小数）</td><td><code>42</code>, <code>3.14</code></td></tr><tr><td><strong>Boolean</strong></td><td>真偽値型（論理型）</td><td><code>true</code>, <code>false</code></td></tr><tr><td><strong>Null</strong></td><td>値が存在しないことを示す型</td><td><code>null</code></td></tr><tr><td><strong>Date</strong></td><td>日付型（日時を含む場合もあり）</td><td>2023-01-01</td></tr></tbody></table></div></figure>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-check block-box">
<p><span class="badge-green">ポイント</span>　<strong>DataWeaveの型システムは動的型付け</strong></p>



<p>DataWeaveは、データ型を<strong>明示的に宣言する必要がない</strong>動的型付けの仕組みを持っています。つまり、変数やデータの型は、DataWeaveが自動的に解釈して適切な操作を適用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    inferredString: "Hello",    // Stringとして認識
    inferredNumber: 123,        // Numberとして認識
    inferredBoolean: true,      // Booleanとして認識
    inferredNull: null          // Nullとして認識
}
</pre>



<p><span class="badge-green">ポイント</span>　<strong>必要に応じて明示的に型を指定</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    explicitNumber: "123" as Number,  // StringをNumberに変換
    explicitString: 456 as String     // NumberをStringに変換
}
</pre>



<p><span class="blue"><code>as</code> </span>演算子で型変換を行うことも可能です。DataWeaveでは型変換が明示的にも行えるため、必要に応じて適切なデータ型を指定することができます。</p>
</div>



<h3 class="wp-block-heading"><span id="toc8">配列 (Array)</span></h3>



<ul class="wp-block-list">
<li>配列は<code><span class="blue">[ ]</span></code>で表します。<code>["apple", "banana", "orange"]</code></li>



<li>ネストする場合：<code>[1, 2, ["nested", "array"], 4]</code></li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    // 元の配列
    originalArray: [1, 2, 3, 4, 5], 
    // 結果: [1, 2, 3, 4, 5]

    // 配列の各要素を2倍に変換
    doubledValues: [1, 2, 3, 4, 5] map $ * 2, 
    // 結果: [2, 4, 6, 8, 10]

    // 偶数のみを抽出
    evenNumbers: [1, 2, 3, 4, 5] filter $ mod 2 == 0, 
    // 結果: [2, 4]

    // 最初の3つの要素を取得
    firstThree: [1, 2, 3, 4, 5][0 to 2], 
    // 結果: [1, 2, 3]

    // 配列内で各要素に対してインデックスも使用して新しい形式に変換
    indexedValues: [10, 20, 30] map (value, index) -> {
        index: index,
        value: value
    }
    // 結果: [{"index": 0, "value": 10}, {"index": 1, "value": 20}, {"index": 2, "value": 30}]
}
</pre>



<h3 class="wp-block-heading"><span id="toc9">オブジェクト (Object)</span></h3>



<p>DataWeaveのオブジェクトは、<strong><span class="marker-under">キーと値のペアで構成されるデータ構造</span></strong>です。本質的には、JSONのオブジェクトと同じ概念で、データを<strong>構造化して整理</strong>するために使われます。</p>



<ul class="wp-block-list">
<li>オブジェクトは <code><span class="blue">{ }</span></code> で表し、キーと値をペアで記述。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
    "name": "Taro",
    "age": 20
}
</pre>



<p>キーに変数などを利用したい場合はダブルクォートやバッククォートを使わずに直接書くこともできます(ただし特殊文字を含む場合はクォート必須)。</p>



<p>オブジェクトの値にはスカラー型、配列、他のオブジェクトをネスト可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
    user: { name: "Taro", age: 25 },
    roles: ["admin", "editor"]
}
</pre>



<h3 class="wp-block-heading"><span id="toc10">Date/Time型</span></h3>



<ul class="wp-block-list">
<li>DataWeaveには日時型リテラルがあります。
<ul class="wp-block-list">
<li>例： <code>|2023-01-01|</code> はDate、 <code>|2023-01-01T12:34:56|</code>はDateTimeなど</li>
</ul>
</li>



<li>内部的には<code>java.time</code>のAPIを活用して処理されます。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    // 現在の日付と時刻
    currentDateTime: now(),

    // 現在の日付のみ
    currentDate: now() as Date,

    // 現在時刻をフォーマット (例: yyyy/MM/dd HH:mm:ss)
    formattedDateTime: now() as String {format: "yyyy/MM/dd HH:mm:ss"},

    // 日付文字列をDate型に変換
    stringToDate: "2025-01-21" as Date,

    // Date型に日数を加算
    datePlus5Days: |2025-01-21| + |P5D|, // 5日を加算 (P5Dは期間のISO 8601表記)

    // DateTime型の差分計算
    daysBetween: daysBetween(|2025-01-21|, |2025-01-26|)
}
</pre>



<h2 class="wp-block-heading"><span id="toc11">変数と命名</span></h2>



<h3 class="wp-block-heading"><span id="toc12">変数宣言</span></h3>



<p>DataWeaveでは、<code><span class="blue">var</span></code>キーワードを使用して変数を宣言し、後で使用することができます。スクリプトのHeaderか、Bodyの任意の位置で宣言できますが、スコープに注意しましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
var greeting = "Hello"
var year = 2025
{
    message: greeting ++ " DataWeave!",
    currentYear: year
}

// ++ は文字列の連結演算子 //</pre>



<h3 class="wp-block-heading"><span id="toc13">letブロック内での変数宣言</span></h3>



<p>スクリプトの中で部分的な計算に利用する変数を宣言するときには<code>let</code>ブロックを使います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    result: do {
        var x = 10
        var y = 20
        ---
        x + y
    }
}
</pre>



<p><code><span class="blue">do { ... }</span></code>ブロック（旧称<code>do</code>ブロック）内で<code>var</code>を使って変数を定義し、ブロックの最後の式を返り値として利用できます。</p>



<h2 class="wp-block-heading"><span id="toc14">関数</span></h2>



<h3 class="wp-block-heading"><span id="toc15">関数の定義</span></h3>



<p>DataWeaveでは<code><span class="blue">fun</span></code>キーワードを使用して関数を定義できます。関数は基本的に<strong>不変（Immutable）</strong>な引数をとり、副作用がない形式で記述が可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fun 関数名 (引数1: 型, 引数2: 型 = デフォルト値, ...) : 戻り値の型 = 式
</pre>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong><code>fun</code></strong>: 関数を定義するキーワード。</li>



<li><strong>関数名</strong>: 任意の識別子（アルファベット、数字、アンダースコアで構成）。</li>



<li><strong>引数</strong>:
<ul class="wp-block-list">
<li>引数名と型を指定（例: <code>x: Number</code>）。</li>



<li>必要に応じてデフォルト値を設定可能（例: <code>y: Number = 10</code>）。</li>
</ul>
</li>



<li><strong>戻り値の型</strong>（省略可能）:
<ul class="wp-block-list">
<li>関数が返すデータの型を指定。</li>
</ul>
</li>



<li><strong>式</strong>:
<ul class="wp-block-list">
<li>関数のロジックを記述。最後の評価結果が返り値となる。</li>
</ul>
</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
fun add(a, b) = a + b
fun greet(name) = "Hello " ++ name

{
    sum: add(5, 7),
    greeting: greet("DataWeave")
}
</pre>



<p><strong>ポイント</strong>: 関数は式として利用でき、変数へ格納したり、ほかの関数に渡したりできます。</p>



<h3 class="wp-block-heading"><span id="toc16">引数の型指定</span></h3>



<p>DataWeave 2.0 では任意で引数や戻り値に型を指定できます。指定しない場合は動的に解釈されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fun add(a: Number, b: Number): Number = a + b
</pre>



<h3 class="wp-block-heading"><span id="toc17">ローカル関数とグローバル関数</span></h3>



<ul class="wp-block-list">
<li>スクリプトヘッダに宣言すると<strong>グローバル関数</strong>として使用できます。</li>



<li><code><span class="blue">do { }</span></code>ブロック内で宣言すれば、スコープ内限定のローカル関数として使用可能です。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc18">条件分岐とパターンマッチ</span></h2>



<h3 class="wp-block-heading"><span id="toc19">if ... else</span></h3>



<p>DataWeaveでも一般的な条件分岐として<code><span class="blue">if ... else</span></code>が使えます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">if 条件式 
    then 真の場合の値 
    else 偽の場合の値
</pre>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong><code>if</code></strong>: 条件式の開始キーワード。</li>



<li><strong>条件式</strong>: <code>true</code> または <code>false</code> を返す式を記述。例: <code>x &gt; 10</code>。</li>



<li><strong><code>then</code></strong>: 条件が<code>true</code>のときに評価される値。</li>



<li><strong><code>else</code></strong>: 条件が<code>false</code>のときに評価される値。</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
fun checkNumber(n) =
    if (n > 0) "positive"
    else if (n &lt; 0) "negative"
    else "zero"

{
    result1: checkNumber(10),
    result2: checkNumber(-5),
    result3: checkNumber(0)
}
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    ageCategory: 
        if payload.age >= 18 
            then "Adult"
            else "Child"
}
// 入力例: {"age": 20} -> 出力: {"ageCategory": "Adult"}
// 入力例: {"age": 15} -> 出力: {"ageCategory": "Child"}
</pre>



<h3 class="wp-block-heading"><span id="toc20">match演算子(パターンマッチ)</span></h3>



<p>DataWeaveにはパターンマッチングを使う機能があります。これを使うと、値や型に応じた複雑な分岐をシンプルに書くことができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">value match {
    case 条件1 -> 処理1,
    case 条件2 -> 処理2,
    ...
    else -> デフォルト処理
}
</pre>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong><code>value</code></strong>: マッチ対象の値。</li>



<li><strong><code>case 条件 -&gt; 処理</code></strong>: 条件に一致した場合の処理。</li>



<li><strong><code>else -&gt; 処理</code></strong>: どの条件にも一致しない場合の処理（オプション）。</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
fun matchType(value) = 
    value match {
        case is Number -> "これは数字"
        case is String -> "これは文字列"
        case is Array -> "これは配列"
        else -> "それ以外"
    }

{
    testNumber: matchType(42),
    testString: matchType("Hello"),
    testArray: matchType([1,2,3]),
    testOther: matchType({ key: "value" })
}
</pre>



<ul class="wp-block-list">
<li><code>case is Number</code>のように型判定が可能です。</li>



<li>値そのものをパターンとして指定することもできます。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
fun matchValue(value) =
    value match {
        case 0 -> "ゼロです",
        case 1 -> "ワンです",
        case -1 -> "マイナスワンです",
        else -> "その他の値です"
    }

{
    result1: matchValue(0),
    result2: matchValue(1),
    result3: matchValue(-1),
    result4: matchValue(5)
}
</pre>



<h2 class="wp-block-heading"><span id="toc21">イテレーションと高階関数</span></h2>



<p>高階関数は「<strong>関数を操作する関数</strong>」であり、配列やオブジェクトのようなデータ構造を柔軟に操作するための重要なツールです。DataWeaveのデータ変換でよく利用されるので、特に<code><span class="blue">map</span></code>や<code><span class="blue">filter</span></code>のような典型例を理解しておくと便利です！</p>



<h3 class="wp-block-heading"><span id="toc22">map</span></h3>



<p><strong>配列</strong>あるいは<strong>オブジェクト</strong>に対して要素ごとに処理を行い、変換した結果を返すのが<code>map</code>です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">array map (item, index) -> 式

/*
[1, 2, 3] map (item, index) -> item * index
// 結果: [0, 2, 6]
*/</pre>



<p><strong>配列の例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
["apple", "banana", "orange"]
    // 各要素に対して処理
    map (item, index) -> {
        fruit: item,
        index: index
    }
</pre>



<p><code>map (item, index) -&gt; ...</code> の形で、要素とインデックスを引数として受け取れます。</p>



<p><strong>オブジェクトの例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    a: 1,
    b: 2,
    c: 3
}
    mapObject (value, key) -> (key ++ "_value") : value * 2
</pre>



<p><code>mapObject (value, key) -&gt; ...</code> を使うと、オブジェクトを別の形に変換できます。上記例ではキーを変えて値を倍にする処理をしています。</p>



<h3 class="wp-block-heading"><span id="toc23">filter</span></h3>



<p>配列やオブジェクトの要素を条件に基づいて絞り込み（フィルタリング）します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">array filter (item, index) -> 条件式
</pre>



<ul class="wp-block-list">
<li><strong><code>array</code></strong>: 操作対象の配列。</li>



<li><strong><code>item</code></strong>: 現在の要素。</li>



<li><strong><code>index</code></strong>: 現在の要素のインデックス（省略可能）。</li>



<li><strong><code>条件式</code></strong>: 各要素を絞り込むための条件（<strong><span class="marker-under"><code>true</code>を返す要素が結果に含まれる</span></strong>）。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
[1, 2, 3, 4, 5]
    filter (item) -> item % 2 == 1

// 上記は奇数だけをフィルタリングします。//</pre>



<h3 class="wp-block-heading"><span id="toc24">reduce</span></h3>



<p>配列の要素を1つに集約（畳み込み）するときに用います。初期値と畳み込みロジックを指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
[1, 2, 3, 4, 5]
    reduce (item, accumulator = 0) -> accumulator + item

// 例では配列の合計値を求めています。//</pre>



<h3 class="wp-block-heading"><span id="toc25">その他の高階関数</span></h3>



<ul class="wp-block-list">
<li><code>pluck</code>： オブジェクトからキー・値・インデックス（またはキー）を取り出して配列に変換</li>



<li><code>flatMap</code>： map後の配列をフラットに結合</li>



<li><code>distinctBy</code>： ユニークな要素抽出</li>
</ul>



<p>など多数の高階関数が用意されています。</p>



<h2 class="wp-block-heading"><span id="toc26">主要な演算子・機能</span></h2>



<h3 class="wp-block-heading"><span id="toc27">オブジェクトのスプレッド・結合</span></h3>



<p>DataWeaveではオブジェクトのマージや配列の連結を簡単に行えます。</p>



<p><strong>オブジェクトの結合</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
var person1 = { name: "Taro", age: 20 }
var person2 = { age: 25, city: "Tokyo" }
---
person1 ++ person2


/*
{
  "name": "Taro",
  "age": 25,
  "city": "Tokyo"
}
*/</pre>



<p>同じキーがある場合は右側が優先されます（例：ageが25になる）。</p>



<p><strong>配列の結合</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
[1, 2, 3] ++ [4, 5, 6]

// 配列の場合は単純に連結します: [1,2,3,4,5,6] //</pre>



<h3 class="wp-block-heading"><span id="toc28">オブジェクトの破壊的パターン(Destructuring)</span></h3>



<p>オブジェクトのキーを展開してローカル変数として取り出すことができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
fun getPersonInfo(person) = 
    // { name, age, city = "Unknown" } でpersonのキーを抜き出す
    person match {
        case { name, age, city = "Unknown" } -> 
            "Name: " ++ name ++ ", Age: " ++ age ++ ", City: " ++ city
        else -> "No match"
    }

getPersonInfo({ name: "Hanako", age: 23 })
</pre>



<ul class="wp-block-list">
<li><code>city = "Unknown"</code> は、キー<code>city</code>が存在しない場合にデフォルト値として<code>"Unknown"</code>を割り当てる書き方です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc29">when ... otherwiseによる条件生成</span></h3>



<p>オブジェクトのフィールドを生成するときに条件分岐を使う場合、<code>when ... otherwise</code>を活用するとスッキリ書けます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    discount: (payload.price > 1000) when true else 0,
    category: "premium" when (payload.price > 500) else "standard"
}
</pre>



<h2 class="wp-block-heading"><span id="toc30">各種フォーマットの入出力</span></h2>



<h3 class="wp-block-heading"><span id="toc31">JSONの読み書き</span></h3>



<ul class="wp-block-list">
<li><strong>読み取り</strong>: <code>input application/json</code> でペイロードをJSONとして解釈。</li>



<li><strong>書き出し</strong>: <code>output application/json</code> で結果をJSONとして出力。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
payload // JSON形式の入力をそのまま出力
</pre>



<h3 class="wp-block-heading"><span id="toc32">XMLの読み書き</span></h3>



<ul class="wp-block-list">
<li><strong>読み取り</strong>: <code>input application/xml</code></li>



<li><strong>書き出し</strong>: <code>output application/xml</code></li>
</ul>



<p><strong>XML入力例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;book>
  &lt;title>DataWeave in Action&lt;/title>
  &lt;author>John Doe&lt;/author>
&lt;/book>
</pre>



<p>DataWeaveで扱うとオブジェクトに変換されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "book": {
    "title": "DataWeave in Action",
    "author": "John Doe"
  }
}
</pre>



<p><strong>XML出力例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/xml
---
{
    book: {
        title: "DataWeave in Action",
        author: "John Doe"
    }
}
</pre>



<p><code>book</code>がルート要素となります。</p>



<h3 class="wp-block-heading"><span id="toc33">CSVの読み書き</span></h3>



<ul class="wp-block-list">
<li><strong>読み取り</strong>: <code>input text/csv separator=","</code></li>



<li><strong>書き出し</strong>: <code>output text/csv</code></li>
</ul>



<p><strong>CSV入力例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">name,age,city
Taro,20,Tokyo
Hanako,25,Osaka
</pre>



<p>DataWeaveで扱うと<strong>配列のオブジェクト</strong>として解釈されます:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[
  { "name": "Taro", "age": "20", "city": "Tokyo" },
  { "name": "Hanako", "age": "25", "city": "Osaka" }
]
</pre>



<p><strong>CSV出力例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output text/csv
---
[
    { name: "Taro", age: 20, city: "Tokyo" },
    { name: "Hanako", age: 25, city: "Osaka" }
]
</pre>



<p>これが下記のようなCSVになる：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">name,age,city
Taro,20,Tokyo
Hanako,25,Osaka
</pre>



<h3 class="wp-block-heading"><span id="toc34">その他の形式</span></h3>



<ul class="wp-block-list">
<li><strong>YAML</strong> なども同様に扱えます。( <code>input application/yaml</code>, <code>output application/yaml</code> )</li>



<li><strong>Java オブジェクト</strong> (上級者向け): Mule Flows でJavaコンポーネントなどを使う場合に、DataWeaveでJavaオブジェクトに直接アクセスすることもできます。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc35">モジュールと拡張機能</span></h2>



<h3 class="wp-block-heading"><span id="toc36">モジュールのインポート</span></h3>



<p>DataWeave 2.0 では <code>import</code> 構文を使用して、外部のモジュールやユーザー定義モジュールを読み込めます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
import myModule from modules::myModule
output application/json
---
myModule.someFunction(payload)
</pre>



<ul class="wp-block-list">
<li>Muleプロジェクト内で<code>src/main/resources/modules/myModule.dwl</code>のようなパスにモジュールを定義しておけばインポートできます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc37">関数のエイリアス</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
import upperCase as uc from dw::core::Strings
output application/json
---
uc("hello world")
</pre>



<ul class="wp-block-list">
<li>公式モジュール<code>dw::core::Strings</code>などもよく活用します。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc38">有名な組み込みモジュール例</span></h3>



<ul class="wp-block-list">
<li><code>dw::core::Strings</code>：文字列操作（<code>upperCase</code>, <code>lowerCase</code>, <code>split</code>, etc.）</li>



<li><code>dw::core::Dates</code>：日時操作（<code>now()</code>, <code>toString()</code>, etc.）</li>



<li><code>dw::core::Numbers</code>：数値操作（<code>round</code>, <code>floor</code>, <code>ceiling</code>, etc.）</li>



<li><code>dw::core::Binaries</code>：バイナリデータ操作</li>



<li><code>dw::core::Crypto</code>：暗号化ハッシュや署名</li>
</ul>



<h2 class="wp-block-heading"><span id="toc39">DataWeave 2.0でのよく使う式の実例</span></h2>



<h3 class="wp-block-heading"><span id="toc40">JSON -&gt; JSONの変換例</span></h3>



<p><strong>入力(JSON)</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
  "users": [
    { "name": "Taro", "age": 20 },
    { "name": "Hanako", "age": 25 }
  ],
  "admin": "Yamada"
}
</pre>



<p><strong>出力(JSON)に変換する例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    administrator: payload.admin,
    userCount: sizeOf(payload.users),
    userNames: payload.users map (u) -> u.name
}
</pre>



<p><strong>結果:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
    "administrator": "Yamada",
    "userCount": 2,
    "userNames": ["Taro", "Hanako"]
}
</pre>



<h3 class="wp-block-heading"><span id="toc41">JSON -&gt; CSVの変換例</span></h3>



<p><strong>入力(JSON)</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[
    { "name": "Taro", "age": 20, "city": "Tokyo" },
    { "name": "Hanako", "age": 25, "city": "Osaka" }
]
</pre>



<p><strong>変換スクリプト</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output text/csv quoteValues=false
---
payload
</pre>



<p><strong>結果(CSV):</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">name,age,city
Taro,20,Tokyo
Hanako,25,Osaka
</pre>



<h3 class="wp-block-heading"><span id="toc42">XML -&gt; JSONの変換例</span></h3>



<p><strong>入力(XML)</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;departments>
  &lt;department>
    &lt;id>1&lt;/id>
    &lt;name>Sales&lt;/name>
  &lt;/department>
  &lt;department>
    &lt;id>2&lt;/id>
    &lt;name>Engineering&lt;/name>
  &lt;/department>
&lt;/departments>
</pre>



<p><strong>DataWeave</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
payload.departments.department map (dept) -> {
    departmentId: dept.id,
    departmentName: dept.name
}
</pre>



<p><strong>結果(JSON):</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[
  {
    "departmentId": "1",
    "departmentName": "Sales"
  },
  {
    "departmentId": "2",
    "departmentName": "Engineering"
  }
]
</pre>



<h3 class="wp-block-heading"><span id="toc43">名前空間 (Namespace) の扱い (主にXML)</span></h3>



<p>XMLで名前空間がある場合、DataWeaveではキーに <code>ns0::element</code> の形式を用います。必要に応じてHeaderで<code>xmlns</code>を定義できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
ns ns0 urn:example
---
payload.ns0::Root.ns0::Child
</pre>



<h3 class="wp-block-heading"><span id="toc44">変換フロー内でのattributesの利用</span></h3>



<p>MuleのFlowでファイルを読み込んだ場合など、メッセージのメタデータは<code>attributes</code>に格納されます。DataWeaveスクリプト内では<code>attributes</code>にアクセスしてヘッダ情報やファイル名などを参照できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%dw 2.0
output application/json
---
{
    fileName: attributes.fileName,
    fileSize: attributes.fileSize,
    content: payload
}
</pre>



<h3 class="wp-block-heading"><span id="toc45">スクリプトのモジュール化・再利用</span></h3>



<p>大規模プロジェクトでは、複数のDataWeaveスクリプトを<strong>モジュール化</strong>して整理すると管理が楽になります。</p>



<ul class="wp-block-list">
<li><code>myModule.dwl</code> を作り、共通の関数を定義</li>



<li>他のDataWeaveスクリプトで <code>import</code> して利用</li>
</ul>



<h3 class="wp-block-heading"><span id="toc46">関数型プログラミングの活用</span></h3>



<p>DataWeaveは変数の再代入ができないため、<strong>副作用が少ない</strong>関数型スタイルでコードを整理できます。</p>



<ul class="wp-block-list">
<li>無名関数を多用</li>



<li>変数に依存せず引数→戻り値のみでロジックを記述</li>
</ul>



<h3 class="wp-block-heading"><span id="toc47">ストリーミング</span></h3>



<p>大容量データを扱う場合、DataWeaveは<strong>ストリーミングモード</strong>でデータを逐次処理できます。<code>&lt;all&gt;</code>に対応するような設定をすると、全件読み込まずに処理するなどの最適化が可能です（ただし処理内容によってはバッファリングが入るので要注意）。</p>



<h2 class="wp-block-heading"><span id="toc48">ベストプラクティス</span></h2>



<ol class="wp-block-list">
<li><strong>マッピングの見やすさを優先</strong><br>変換ロジックが可読性を保つように、<code>mapObject</code> などを適切に使い、フラットに書きすぎない。</li>



<li><strong>関数の分割・再利用</strong><br>1つの巨大スクリプトにまとめるのではなく、意味ごとに関数を分割したり、別ファイルに切り出す。</li>



<li><strong>Null処理を明示的に</strong><br>Nullを許容するか、<code>default</code>値を設定するかを早期に決める。<code>skipNullOn="everywhere"</code> などのオプションも活用。</li>



<li><strong>型を意識する</strong><br>特にCSVやXMLなどの入出力時は文字列になりやすいので、必要なら<code>toNumber()</code>等で型変換する。
<ul class="wp-block-list">
<li>例: <code>payload.age as Number</code></li>
</ul>
</li>



<li><strong>サイズの大きいデータはストリーミングやchunkを検討</strong><br>大量データを扱う場合、メモリやパフォーマンスに注意。DataWeaveのストリーミング機能を使い、可能な限り流し込み変換できるように工夫する。</li>



<li><strong>エラーハンドリングを考慮</strong><br>変換処理中に異常データが来る場合、例外ハンドリングや<code>try</code>モジュールを組み合わせる。</li>



<li><strong>テスト可能性</strong><br>MUnitなどのテスティングフレームワークを使ってDataWeaveスクリプトを単体テストする。関数型の構造を取るとテストしやすい。</li>
</ol>



<p>このガイドでは、DataWeaveを扱うための基本概念から、構文、主要な関数、高度なモジュール活用例、ベストプラクティスまで幅広く紹介しました。<strong>DataWeaveはMuleSoftの強力なデータ変換エンジン</strong>であり、宣言的なスタイルと豊富なビルトイン関数を活用することで、複雑なデータマッピングを簡潔に表現できます。</p>



<p>実際の現場で扱うデータフォーマットは多岐にわたり、要件も多様です。しかしDataWeaveの表現力と拡張性を駆使すれば、<strong>JSON, XML, CSV, YAML, Javaオブジェクトなどの複数フォーマット間の変換</strong>を効率よく行えます。</p>



<p>ぜひ今回のガイドを参考にしながら、ご自身のプロジェクトでDataWeaveを活用し、実践的なスクリプトを書いてみてください。「<strong>書いて試す</strong>」ことが習熟への近道です。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
