Azure Logic Apps を使用するワークフローで Liquid テンプレートをマップとして使用して JSON と XML を変換します。
適用対象: Azure Logic Apps (従量課金プラン + Standard)
ロジック アプリ ワークフローで基本的な JSON 変換を実行する場合は、Compose アクションや Parse JSON アクションなどの組み込みのデータ操作を使用できます。 ただし、一部のシナリオでは、反復、制御フロー、変数などの要素を含む高度で複雑な変換が必要になる場合があります。 JSON から JSON、JSON からテキスト、XML から JSON、または XML からテキストへの変換の場合、Liquid オープンソース テンプレート言語を使用して、必要なマッピングまたは変換を記述するテンプレートを作成できます。 このテンプレートは、Liquid 組み込みアクションをワークフローに追加するときに選択できます。 Liquid アクションは、マルチテナントの従量課金ロジック アプリ ワークフローとシングルテナントの Standard ロジック アプリ ワークフローで使用できます。
Liquid トリガーは使用できませんが、任意のトリガーまたはアクションを使用して、ソースの JSON または XML コンテンツをワークフローにフィードできます。 たとえば、組み込みのコネクタ トリガー、Azure Logic Apps で使用できるマネージドまたは Azure でホストされるコネクタ トリガー、または別のアプリを使用できます。
この記事では、次のタスクを完了する方法について説明します。
- Liquid テンプレートを作成する。
- 従量課金ロジック アプリ ワークフローの統合アカウントまたは任意の子ワークフローで使用する Standard ロジック アプリ リソースにテンプレートをアップロードします。
- ワークフローに Liquid アクションを追加します。
- 使用するマップとしてテンプレートを選択する。
詳細については、次のドキュメントを確認してください。
- Azure Logic Apps でデータの操作を実行する
- Liquid オープン ソース テンプレート言語
- 従量課金制と Standard ロジック アプリ
- 統合アカウントの組み込みコネクタ
- Azure Logic Apps の組み込みコネクタの概要
- Azure Logic Apps のマネージド コネクタまたは Azure でホストされるコネクタの概要および Azure Logic Apps のマネージド コネクタまたは Azure でホストされるコネクタ
前提条件
Azure アカウントとサブスクリプション。 サブスクリプションをお持ちでない場合には、無料の Azure アカウントにサインアップしてください。
ロジック アプリのリソースとワークフロー。 Liquid 操作には使用可能なトリガーがないため、ワークフローに含めるトリガーは最小限にする必要があります。 詳細については、次のドキュメントを参照してください:
従量課金制または Standard ロジック アプリ ワークフローのどちらを使用しているかに基づいて、統合アカウント リソースが必要になります。 通常、このリソースは、エンタープライズ統合と B2B ワークフローで使用するために成果物を定義して格納する場合に必要です。
重要
連携するには、統合アカウントとロジック アプリ リソースの両方が、同じ Azure サブスクリプションと Azure リージョンに存在する必要があります。
従量課金ロジック アプリ ワークフローで作業している場合、統合アカウントにはロジック アプリ リソースへのリンクが必要です。
Standard ロジック アプリ ワークフローで作業している場合は、次のシナリオに基づいて、統合アカウントをロジック アプリ リソースにリンクするか、マップをロジック アプリ リソースに直接アップロードするか、またはその両方を行うことができます。
必要なまたは使用したい成果物を含む統合アカウントが既にある場合は、成果物を使用する場所になる複数の Standard ロジック アプリ リソースに統合アカウントをリンクできます。 こうすることで、個々のロジック アプリにマップをアップロードする必要がありません。 詳細については、ロジック アプリ リソースの統合アカウントへのリンクに関するページを参照してください。
Liquid 組み込みコネクタを使用すると、ロジック アプリ リソースまたはリンクされた統合アカウントに以前にアップロードしたマップを選択できます (両方のマップは選択できません)。 その後、同じロジック アプリ リソース内のすべての子ワークフローで、これらの成果物を使用できます。
そのため、統合アカウントがないか、または必要としない場合は、アップロード オプションを使用できます。 それ以外の場合は、リンク オプションを使用できます。 どちらの方法でも、同じロジック アプリ リソース内のすべての子ワークフローで、これらの成果物を使用できます。
Liquid テンプレートの言語に関する基本的な知識。 Azure Logic Apps には DotLiquid 2.0.361 が使用されます。
注意
[Transform JSON to JSON](JSON を JSON に変換) という名前の Liquid アクションは、Liquid の DotLiquid 実装に従います。これは、特定のケースにおいて Liquid の Shopify 実装とは異なります。 詳細については、「Liquid テンプレートに関する考慮事項」を参照してください。
HTTP 要求を送信してソリューションをテストできる次のようなツールをインストールまたは使用します。
- Visual Studio Code を Visual Studio Marketplace からの拡張機能と一緒に使用する
- PowerShell Invoke-RestMethod
- Microsoft Edge - ネットワーク コンソール ツール
- Bruno
- curl
注意事項
資格情報、シークレット、アクセス トークン、API キーなどの機密データがあるシナリオでは、必要なセキュリティ機能でデータを保護したうえで、ツールは必ずオフラインまたはローカルで動作し、データをクラウドに同期せず、オンライン アカウントにサインインする必要がないものを使用してください。 このようにすることで、機密データを一般に公開するリスクを軽減できます。
手順 1: テンプレートを作成する
ロジック アプリ ワークフロー内で Liquid 変換を実行するには、まず、必要なマッピングを定義する Liquid テンプレートを作成する必要があります。
JSON 変換のマップとして使用する Liquid テンプレートを作成します。 必要な任意の編集ツールを使用できます。
この記事の JSON から JSON への変換の例では、次のサンプル Liquid テンプレートを使用します。
{%- assign deviceList = content.devices | Split: ', ' -%} { "fullName": "{{content.firstName | Append: ' ' | Append: content.lastName}}", "firstNameUpperCase": "{{content.firstName | Upcase}}", "phoneAreaCode": "{{content.phone | Slice: 1, 3}}", "devices" : [ {%- for device in deviceList -%} {%- if forloop.Last == true -%} "{{device}}" {%- else -%} "{{device}}", {%- endif -%} {%- endfor -%} ] }
Liquid テンプレート (.liquid) ファイル拡張子を使用してテンプレートを保存します。 この例では、SimpleJsonToJsonTemplate.liquid を使用します。
手順 2: Liquid テンプレートをアップロードする
Liquid テンプレートを作成したら、次のシナリオに基づいてテンプレートをアップロードする必要があります。
従量課金ロジック アプリ ワークフローで作業している場合は、統合アカウントにテンプレートをアップロードします。
Standard ロジック アプリ ワークフローで作業している場合は、 統合アカウントにテンプレートをアップロードするか、ロジック アプリ リソースにテンプレートをアップロードすることができます。
統合アカウントにテンプレートをアップロードする
Azure アカウントの資格情報で Azure portal にサインインします。
Azure portal の検索ボックスに「統合アカウント」と入力し、[統合アカウント] を選択します。
統合アカウントを探して選択します。
統合アカウントのナビゲーション メニューで、[設定] の [マップ] を選択します。
[マップ] ペインで、[追加] を選択します。 マップについて以下の情報を入力します。
プロパティ 値 内容 名前 JsonToJsonTemplate
マップの名前 (この例では "JsonToJsonTemplate")。 マップの種類 Liquid マップの種類。 JSON から JSON への変換では、[liquid] を選択する必要があります。 Map SimpleJsonToJsonTemplate.liquid
変換に使用する既存の Liquid テンプレートまたはマップ ファイル (この例では "SimpleJsonToJsonTemplate.liquid")。 このファイルを見つけるには、ファイル ピッカーを使用できます。 マップ サイズの制限については、制限と構成に関する情報を参照してください。
テンプレートを Standard ロジック アプリにアップロードする
Azure portal で、ご利用のロジック アプリ リソースを見つけて選択します。 ワークフロー レベルではなく、リソース レベルであることを確認します。
ロジック アプリ リソースのナビゲーション メニューで、[成果物]の [マップ] を選択します。
[Maps] ペインのツール バーで、 [追加] を選択します。
[マップの追加] ペインで、テンプレートに関する次の情報を指定します。
プロパティ 値 内容 名前 JsonToJsonTemplate
マップの名前 (この例では "JsonToJsonTemplate")。 マップの種類 Liquid マップの種類。 JSON から JSON への変換では、[liquid] を選択する必要があります。 Map SimpleJsonToJsonTemplate.liquid
変換に使用する既存の Liquid テンプレートまたはマップ ファイル (この例では "SimpleJsonToJsonTemplate.liquid")。 このファイルを見つけるには、ファイル ピッカーを使用できます。 マップ サイズの制限については、制限と構成に関する情報を参照してください。 終了したら、 [OK] を選択します。
マップ ファイルのアップロードが完了すると、 [マップ] の一覧にマップが表示されます。 統合アカウントの [概要] ページの [成果物] には、アップロードしたマップも表示されます。
手順 3: Liquid 変換アクションを追加する
次の手順では、従量課金および Standard ロジック アプリ ワークフローの Liquid 変換アクションを追加する方法を示します。
Azure Portal から、デザイナーでロジック アプリ ワークフローを開きます (まだ開いていない場合)。
ワークフローに必要なトリガーやその他のアクションがワークフローにない場合は、最初にそれらの操作を追加します。 Liquid 操作には、使用可能なトリガーがありません。
この例では、"When a HTTP request is received" という名前の要求トリガーを使用して続行します。
ワークフロー デザイナーで、Liquid アクションを追加するステップの下にある [新しいステップ] を選択します。
[操作を選択してください] の検索ボックスで、 [すべて] を選択します。 検索ボックスに「liquid」と入力します。
[アクション] 一覧から、使用する Liquid アクションを選択します。
この例では、[Transform JSON to JSON](JSON を JSON に変換) という名前のアクションを引き続き使用します。
アクションの [コンテンツ] プロパティで、次の手順に従って、変換するトリガーまたは前のアクションからの JSON 出力を指定します。
[コンテンツ] ボックス内をクリックして、動的コンテンツ リストを表示します。
動的コンテンツの一覧から、変換する JSON データを選択します。
この例では、動的コンテンツの一覧の [HTTP 要求の受信時] で、トリガーからの本文コンテンツ出力を表す Body トークンを選択します。
[マップ] リストから、Liquid テンプレートを選択します。
この例では、JsonToJsonTemplate という名前のテンプレートを使用して続行します。
Note
マップ リストが空の場合、ロジック アプリ リソースが統合アカウントにリンクされていないか、統合アカウントにマップ ファイルが含まれていません。
完了したアクションは、以下の例のようになります。
ワークフローを保存します。 デザイナーのツール バーで、 [保存] を選択します。
ワークフローのテスト
ワークフローをトリガーするには、次の手順に従います。
[要求] トリガーで、[HTTP POST URL] プロパティを検索し、URL をコピーします。
HTTP 要求ツールを開き、その手順を使用して HTTP 要求を [要求] トリガーで期待されるメソッドなどのコピーした URL に送信します。
この例では、URL を含む
POST
メソッドを使用しています。変換する JSON 入力を含めます。次に例を示します。
{ "devices": "Surface, Mobile, Desktop computer, Monitors", "firstName": "Dean", "lastName": "Ledet", "phone": "(111)0001111" }
ワークフローの実行が完了したら、ワークフローの実行履歴に移動し、 [JSON を JSON に変換] アクションの入力と出力を調べます。次に例を示します。
その他の Liquid 変換
Liquid を使用して他の変換を実行することができます。次に例を示します。
JSON からテキストへの変換
次の Liquid テンプレートは、JSON からテキストへの変換の例を示しています。
{{content.firstName | Append: ' ' | Append: content.lastName}}
次の例は、サンプルの入力と出力を示しています。
XML から JSON への変換
次の Liquid テンプレートは、XML から JSON への変換の例を示しています。
[{% JSONArrayFor item in content -%}
{{item}}
{% endJSONArrayFor -%}]
JSONArrayFor
ループは、XML 入力用のカスタム ループ機構です。これにより、末尾のコンマを回避する JSON ペイロードを作成できます。 また、このカスタム ループ機構の where
条件では、他の Liquid フィルターのように要素の値ではなく、XML 要素の名前が比較に使用されます。 詳細については、「set-body ポリシーの詳細情報」の「もののコレクション」を参照してください。
次の例は、サンプルの入力と出力を示しています。
XML からテキストへの変換
次の Liquid テンプレートは、XML からテキストへの変換の例を示しています。
{{content.firstName | Append: ' ' | Append: content.lastName}}
次の例は、サンプルの入力と出力を示しています。
Liquid テンプレートに関する考慮事項
Liquid テンプレートは、Azure Logic Apps におけるマップのファイル サイズ制限に従います。
[Transform JSON to JSON](JSON を JSON に変換) アクションは、Liquid の DotLiquid 実装に従います。 この実装は、Liquid の Shopify 実装からの .NET Framework へのポートであり、特定のケースで異なります。
次の一覧では、既知の違いについて説明します。
[Transform JSON to JSON](JSON を JSON に変換 ) アクションでは、JSON、XML、HTML などを含む文字列がネイティブに出力されます。 この Liquid アクションは、Liquid テンプレートから予期されるテキスト出力が JSON 文字列であることだけを示します。 このアクションは、入力を JSON オブジェクトとして解析し、Liquid が JSON 構造を解釈できるようにラッパーを適用することをロジック アプリに指示します。 変換後、アクションは、Liquid からのテキスト出力を解析して JSON に戻すようにロジック アプリに指示します。
DotLiquid では JSON はネイティブに認識されないため、バックスラッシュ文字 (
\
) とその他の予約済み JSON 文字を必ずエスケープしてください。テンプレートで Liquid フィルターが使用されている場合は、"文の先頭文字の大文字化" が使用されている DotLiquid と C# の名前付け規則に従っていることを確認してください。 すべての Liquid 変換で、テンプレート内のフィルター名でも文の先頭文字の大文字化が使用されていることを確認してください。 そうしないと、フィルターが機能しません。
たとえば、
replace
フィルターを使用する場合は、replace
ではなくReplace
を使用します。 DotLiquid オンラインで例を試してみる場合も、同じ規則が適用されます。 詳細については、Shopify Liquid フィルターと DotLiquid Liquid フィルターに関するページを参照してください。 Shopify の仕様には、各フィルターの例が含まれているため、比較のために、DotLiquid をオンラインで試すページでそれらの例を試してみることができます。現在、Shopify 拡張機能フィルターの
json
フィルターは DotLiquid では実装されていません。 通常は、このフィルターを使用して、JSON 文字列解析用のテキスト出力を準備できますが、代わりにReplace
フィルターを使用する必要があります。DotLiquid 実装の標準の
Replace
フィルターでは、正規表現 (RegEx) による照合が使用され、Shopify 実装では、単純な文字列の照合が使用されます。 両方の実装は、RegEx の予約文字、またはエスケープ文字を照合パラメーターで使用するまでは、同様に動作するように見えます。たとえば、RegEx の予約バックスラッシュ (
\
) エスケープ文字をエスケープするには、| Replace: '\', '\\'
ではなく| Replace: '\\', '\\'
を使用します。 次の例では、バックスラッシュ文字をエスケープしようとしたときに、Replace
フィルターの動作がどのように異なるかを示します。 次の場合は正しく動作します。{ "SampleText": "{{ 'The quick brown fox "jumped" over the sleeping dog\\' | Replace: '\\', '\\' | Replace: '"', '\"'}}"}
この結果は次のようになります。
{ "SampleText": "The quick brown fox \"jumped\" over the sleeping dog\\\\"}
次の場合は失敗します。
{ "SampleText": "{{ 'The quick brown fox "jumped" over the sleeping dog\\' | Replace: '\', '\\' | Replace: '"', '\"'}}"}
このようなエラーになります。
{ "SampleText": "Liquid error: parsing "\" - Illegal \ at end of pattern."}
詳細については、Replace 標準フィルターでの RegEx パターン マッチングの使用に関する記事を参照してください。
DotLiquid 実装の
Sort
フィルターは、配列またはコレクション内の項目をプロパティによって並べ替えますが、次のような違いがあります。Shopify の sort 動作ではなく、Shopify の sort_natural 動作に従います。
文字列としての英数字の順序でのみ並べ替えを行います。 詳細については、数値の並べ替えに関する記事を参照してください。
大文字と小文字を区別する順序ではなく、"大文字と小文字を区別しない" 順序が使用されます。 詳細については、Sort フィルターが、Shopify の仕様にある大文字と小文字の区別についての動作に従わないことに関する記事を参照してください。