異なるスキーマのJSONデータが送られるLogic Appsで、JSONから特定の要素を取り出したい

このエントリは2023/06/22現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。

いつもとは違う人から、次のような問い合わせが届いた。

問い合わせ

いま、Logic Appsでワークフローを作成しているが、リクエストで渡ってくるJSONのJSONスキーマが数種類ほどあり、どのスキーマに基づいたJSONが届くかわからない。そのため、リクエスト受信時ではなく、必要なタイミングでパースし、各スキーマ固有の処理をしたいが、どうすればよいか?

リクエストで到達するJSONのスキーマが数種類あり、リクエスト受信時に特定のスキーマ決め打ちでパースしても例外が発生するので、なんとかしたい、ということのよう。

どうすればよいか?

リクエストを受け取ったタイミングではスキーマ検証はせず、Parse JSONアクションを使って必要なデータを取得すればよい。スキーマが複数あるなら、並行処理させることも可能。

やってみる

実際に実装例を紹介する。今回はConsumption SKUを使っているが、Standard SKUでも同じ実装が可能。フローの方針は以下の通り。なお、今回は2種類のスキーマに基づいたデータが送信される前提で構成している。

  1. リクエストはOpaqueデータとして受け取っておく
  2. Parse JSONアクションを使い、必要なデータを各スキーマで取得する(スキーマが数種類あるとのことなので、並列でParse JSONアクションを実行してもよい)
  3. 取得した値で処理を分岐(もし文字列なら、文字列長で該当データの有無を判断できる)

って流れで実装したのがこちら。

以後で各フェーズについて説明する。

[1] HTTPリクエスト受信時

下図のように、JSONスキーマは指定しないでおく。

[2] Parse JSONを実行

スキーマが数種類あるとのことなので、並列でParse JSONアクションを実行し、Parseした結果を変数A、Bに設定している(いずれも文字列)。

スコープ失敗時(例えば、HTTPリクエスト本体が空っぽだった場合)にも処理を継続するよう、後続のInitialize response messageアクションのrunAfterプロパティを構成している。

[3] リクエストデータごとにデータ処理を分岐

どのスキーマに基づいたデータかを変数A、Bで判断できるので、Aがあるとき、Bがあるとき、などの形で分岐する。今回はテスト目的なので変数に値を設定しているだけである。

この条件分岐に失敗したとしても応答を返すよう、後続のResponseアクションのrunAfterプロパティを構成している。

これで完了。

テスト

実際に動作確認してみる。特定のスキーマに基づいたメッセージを送ると、当該メッセージからスキーマを識別できるような要素を取得できる。さらに、リクエストメッセージなしでPOSTしても、エラーが返る。

実行履歴を確認すると、両スコープで失敗しているものの、runAfterプロパティを構成していたおかげで、エラーメッセージを返すように動作していることがわかる。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください