序
Power Automate を触っていて実行結果(履歴)を確認してみると、以下の画像の「出力」のように、何やら不思議な文字列の「かたまり」を目にしたことがあるかもしれません。
[{ "バージョン": "2.0", "更新者": "kuro." }] のように、英数字や見慣れない [ ] や { } のような記号が大量に並ぶ出力結果を初めて見ると「何をどのように見ればよいのか」と首を傾げてしまうことでしょう。
上の画像のように、Power Automate は基本的に、画面上の「動的なコンテンツ」をクリックして選ぶだけで必要な値を取り出せるように設計されています。通常のフローを作る範囲であれば、データの内部構造を意識しなくても動かせてしまうことも多いでしょう。
しかし、大量のデータの中から条件に合うものだけを抽出したり、出力形式を整えて次の処理に渡したりといった「便利なフロー」を作ろうとすると、クリック操作だけでは届かない場面が出てきます。その場合、式(Expression)などによる「簡単なキーボード入力」が求められます。
ここで先ほどの「不思議な文字列のかたまり」の正体を突き止めていく必要が出てきます。それが JSON というコンピュータ言語です。JSON は、Power Automate のさまざまなコネクタやアクションの出力などで頻繁に登場しますので、お作法を身に着けておいて損はありません。
本稿は、JSON を「読める」状態になるための最低限の見立てを行い、Power Automate 上で JSON を「操作できる」ようになるための基本手順を整理します。
1. JSON とは
1.1. JSON とは 「データの表現手段」
JSON(JavaScript Object Notation)は、データを文字列として表すための形式です。比較的人間が読みやすく、プログラムでも扱いやすい…といった諸事情から広く使われています。
1.2. JSON の基本構造 (オブジェクトとアレイ)
JSON で重要なのは、まずこの2種類だけです。怒られるかもしれませんが、この2種類が判別できるようになったらまずは初級編クリアです。
- オブジェクト(Object):{ } で囲む。キーと値の集合
- アレイ(Array):[ ] で囲む。値の並び(複数件の情報)
以下、具体例を見てみましょう。
1.2.1. オブジェクト(Object)
次のオブジェクトの内、キーに該当するのは "id", "title", "isActive" であり、値に該当するのは 123, "申請", true です。「キー」というのは「タイトル列」のことだと思っておくと良いでしょう。
{
"id": 123,
"title": "申請",
"isActive": true
}
1.2.2. アレイ(Array)
日本語でいう「配列」と読み替えて差し支えありません。配列とは、表形式のデータのことを指します。次の「アレイ」を表形式に変換してみると構造が掴みやすいです。
[
{ "id": 1, "title": "申請", "isActive": true },
{ "id": 2, "title": "拒否", "isActive": false }
]
| id | title | isActive |
|---|---|---|
| 1 | 申請 | true |
| 2 | 拒否 | false |
例では「オブジェクト」がアレイの中に入っていますが、キーのない配列を成すこともあります。
[
"りんご",
"ごりら",
"らっぱ",
"ぱせり"
]
1.3. 「値」 になれるもの
コンピュータの文脈で「値」が登場したら「データ型」の存在を意識しなければなりません。JSON の値として使える代表は以下の通りです。
- 文字列:"text"
- 数値:123
- ブール値:true あるいは false
- null:null
- オブジェクト:{ ... }
- アレイ:[ ... ]
基本的には、文字列型データを " "(二重引用符 / ダブルクォーテーション)で囲み、数値データやブール値、null 値(=空のデータのこと)には何も付けません。
また、日付型は存在しません。 日付型データは(※多くの場合)文字列型データとして扱われます。日付型データとしてデータを登録したいのに「エラー」となってしまう原因です。
JSON を操作する時に、このデータ型が押さえられていないと泥沼状態になってしまいます。この判定が曖昧なまま進むと、以降の式やアクション選択で迷走してしまいます。選択できないだけならまだしも、エラーの原因を特定しにくくなってしまうことにも繋がります(経験談)
2. JSON 形式のデータを読めるようになる
構造が理解できていないままでは、JSON を自由に扱うことはできるようになりません。まずは、JSON を読めるようになることを目指しましょう。
2.1. 「オブジェクト」 なのか 「アレイ」 なのか
理解のステップとしては、まず、対象の JSON が「オブジェクト」なのか「アレイ」なのかを判断できるようになることです。判別方法は難しくありません。
- 最外側が { } の場合: オブジェクト
- 最外側が [ ] の場合: アレイ
高難度な開発を進めていると、これらが入り混じった出力結果を得ることもあります。しかし、まずは、ざっとこのイメージで取りかかるのが良いかなと考えています。
2.2. オブジェクトの場合は 「欲しい情報に向かって一歩ずつ辿る」
オブジェクトを読み解く作業は、とりも直さず「目的の値までの道順(パス)」を作る作業です。つまり、読めるようになったら、あとは指示文を入力して必要なデータを取り出すだけだと云えます。次の例から考えてみましょう。
{
"user": {
"profile": {
"mail": "test@example.com"
}
}
}
Power Automate でテストを実行した時に、次の出力結果を得たとします。まずは、この出力結果が「オブジェクト」であることを確認します。
次に、欲しい情報の道程を日本語で考えていきます。今回、欲しい情報が「ユーザーのメールアドレス」だとすると、このオブジェクトの中から mail を指定する必要が出てきます。道順として user → profile → mail といった具合で順番に押さえていくことになるでしょう。
階段を降りていくイメージで捉えると安定します。「下位層に潜る」といった表現をする人もいましたが、いずれにせよ、色々なパターンで読み解いていく内に自然と慣れていくはずです。気長に構えましょう。
2.3. アレイが戻って来たら 「1件なのか複数件なのか」 を決める
ほとんどの場合、アレイは「複数件のデータ」を意味します。テストを実行した後、このデータ型で戻って来た場合は次のどれかを先に決めておきます。
- 最初(最後)だけ取りたいのか
- 特定のデータ行を抽出して取りたいのか
- 全件を処理したいのか
以下は、SharePoint リストの更新履歴を取得し、必要な情報だけに整理したものです。
[
{
"バージョン": "2.0",
"更新者": "kuro.",
"更新者メールアドレス": "test@example.com",
"登録者": "kuro.",
"登録者メールアドレス": "test@example.com",
"製品コード": "S202510",
"商品名": "〆サバ",
"生産数": 50
},
{
"バージョン": "1.0",
"更新者": "kuro.",
"更新者メールアドレス": "test@example.com",
"登録者": "kuro.",
"登録者メールアドレス": "test@example.com",
"製品コード": "S202510",
"商品名": "サバ味噌",
"生産数": 50
}
]
これを先ほどと同様に表形式にすると以下のようになります(少し窮屈で申し訳ないです)
| バージョン | 更新者 | 更新者メールアドレス | 登録者 | 登録者メールアドレス | 製品コード | 商品名 | 生産数 |
|---|---|---|---|---|---|---|---|
| 2.0 | kuro. | test@example.com | kuro. | test@example.com | S202510 | 〆サバ | 50 |
| 1.0 | kuro. | test@example.com | kuro. | test@example.com | S202510 | サバ味噌 | 50 |
この表にあるデータの中から最新の情報だけ欲しい場合は、バージョン 2.0 の行、つまり最初の行を指定できれば良いですし、商品名が〆サバに変わる直前の商品名が何だったのかを調査したかった場合であれば、最終行を取得できれば良いことになります。
ここまで読み解いて自分の欲しい情報が明確になれば、あとはインターネットや人工知能での調査ができる段階になったといえそうですね。
一方、この判断が曖昧だと、次章で紹介するアクションの中から適切なものを選べません。フローを実行した時に戻ってくるデータが「アレイ」なのか「オブジェクト」なのかを判断でき、さらに、内容が読めるようになれば、もう JSON 初級者ではありません。
3. JSON 形式のデータを操作する
アレイなのかオブジェクトなのかを判断できるようになったところで、Power Automate に寄せて JSON から実際にデータを取り出す(=整える、整形する)方法です。
整形の基本武器が「データ操作(Data Operations)」コネクタです。本稿では、その代表的なものに焦点を絞って、どういった場面でどういったアクションを使うのかを示します。
3.1. 作成 アクション(Compose)
「作成」アクションは、JSON からデータを取り出す時の作業を楽にしてくれる便利なアクションです。前のアクションから受け取った JSON をそのまま置いて動作を観察したい時や、式を複雑に書きたくないので、一度分解して置きたい時など、用法は様々です。
3.1.1. オブジェクトから特定のデータを取得する
{
"user": {
"profile": {
"mail": "test@example.com"
}
}
}
今回は、上の JSON を「作成」アクションに貼り付け、練習用の一時データとして活用してみたいと思います。次のようにフローを作成してみましょう(もちろん読むだけでも大丈夫です)
説明しやすいので旧デザイナーでフローを作成していますが、新デザイナーを使用しても問題ありません
その後、再び作成アクションを配置し、メールアドレスだけを取得してみましょう。user → profile → mail の順に押さえていくことを思い出してもらえるとスムーズです。
outputs('作成:オブジェクト')['user']?['profile']?['mail']
上の数式をコピー元に取って、次のようにして数式を貼り付けます。
この outputs() とは「出力結果」を得るときに使用する Power Automate の関数です。今回でいうと outputs の ( ) 内に入っている「'作成:オブジェクト'」の出力結果、つまり、入力内容そのものを得ることができます。
アクション名を「作成」のまま変更していなければ、outputs('作成') と入力することで出力結果を得ることができます。
あとは、出力結果の中からキーを辿っていくイメージです。 [ ] で囲まれている部分が「キー」に該当しており、→ に該当する部分が ? に代わっています。
テストを実行してみると、メールアドレスを取得できました。ヘンゼルとグレーテルの童話のように、Web サイトのリンクをクリックして目的のページに潜っていく時のように、目印になるキーを辿っていくだけです。いきなり mail を取得しようとするのではなく、順に押さえていくのが肝要です。
3.1.2. アレイから特定のデータを取得する
今度は、アレイ(配列)から、特定のデータを取得してみましょう。取得するデータは、最新の商品名と措定します。
[
{
"バージョン": "2.0",
"更新者": "kuro.",
"更新者メールアドレス": "test@example.com",
"登録者": "kuro.",
"登録者メールアドレス": "test@example.com",
"製品コード": "S202510",
"商品名": "〆サバ",
"生産数": 50
},
{
"バージョン": "1.0",
"更新者": "kuro.",
"更新者メールアドレス": "test@example.com",
"登録者": "kuro.",
"登録者メールアドレス": "test@example.com",
"製品コード": "S202510",
"商品名": "サバ味噌",
"生産数": 50
}
]
オブジェクトからメールアドレスを取得してきた時と同様に、次のフローを作成します。アクションを配置したら名前の変更も忘れないようにしておきましょう(名前の変更は各アクションの「⋯」のメニューに隠れています)
今回は「作成:アレイ」の①最初の行の内、②商品名だけを取得できればよいので、先ほどと同様に数式を入力していきます。
first(outputs('作成:アレイ'))['商品名']
数式を日本語化すると「出力結果の最初の行データの内、商品名をください」となります。実行結果を確認してみましょう。
なお、first() を使用しない方法もあります。Power Automate の配列データ(アレイ)は、先頭行を [0] と表現し、2行目を [1] と表現します。これを「インデックス」といいます。したがって、次のようにも表現できます。
outputs('作成:アレイ')[0]?['商品名']
数式を日本語化すると「出力結果の1行目の商品名をください」という表現になります。一旦、この ? は「『◯◯の××』を意味する記号」くらいの感覚でいると良いかもしれません。
3.2. 選択 アクション(Select)
選択アクションは、配列の形を作り直したい時などに使用するアクションです。例えば、先ほど「作成」アクションで使用したアレイ(配列)から、商品名と製品コードだけ抽出したい時に使用します。
3.2.1. 基本的な用法
使い方も慣れると簡単なものです。まず「開始」と書かれている部分に「加工前の配列」をセットします。今回は先ほど使用したアレイをそのまま使っているので、動的なコンテンツから「作成:アレイ」の出力を設定します。
マップは、左辺が「キー」となっており、右辺が「値」となっています。この「キー」は、入力に何か決まりがあるわけではないため、自由に入力して問題ありません。究極、AAA でも BBB でも大丈夫です(が、元のアレイのキーを入力する方が管理しやすいです)
今回は、元の配列から「商品名」だけを取り出してみます。
この時、使うのが item() という Power Automate の関数です。選択アクションを使う時によく登場する関数で、自分自身(=設定中の選択アクション)を参照できる関数です。つまり、今回は元の配列から「商品名」に該当する項目を取得できます。
item()['商品名']
なお、item()['商品名'] の [ ] は、加工元の配列で得た「キー」を入力しなければエラーとなります。選択アクションを配置する前にテストを実行して出力結果を手元に残しておくのがコツです。
このようにして、選択アクションは、欲しいデータだけを抽出して新しいテーブルの形に整頓する目的で利用します。応用ですが「他のテーブルデータと統廃合して1つのテーブルとして扱いたい」といった要望にも答えられるアクションだといえるでしょう。
3.2.2. 応用
今回のように「商品名」だけを抽出したい場合であれば、キーを省いた形で「アレイ」の形に整えることも可能です。次の画像のように「テキストモード」に切り替えるボタンがあるのでクリックしてみます。
すると、出力結果と同じような JSON 形式での編集作業ができるようになります。
この状態で入力されていた「マップ」を一度削除し、次のように再入力します(数式は先ほどと同じです)
このように入力した後で実行結果を確認してみると、キーを削除した状態で「値」のみを抽出できるようになります。この使い方が便利で、後述の結合アクションで、連結された文字列として扱うことも可能になります。
3.3. 結合 アクション(Join)
「結合」アクションは、配列(アレイ)を文字列(値)に変換するアクションです。変換された文字列は、指定した記号で連結表示されます。今回は、3.2.2. 応用 で使用した「選択」アクションの出力結果を元に、配列を文字列に変換してみます。
「結合する配列」には、選択アクションで得た出力結果を入力し、連結する記号を「次を使用して結合」に入力します。今回は「、」を使っていますが「;」でも「・」でも使用できます。
実行結果を確認すると、文字列に変換することができました。基本的には「キー」が存在しない配列に対して利用することが多いように感じます。
join(body('選択'),'、')
また、この結合アクションは、join() を利用して「作成」アクションでも代用できます。
よほどのことでもなければ、結合アクションで事足りますが、覚えておいてムダになることはないかもしれません。
3.4. アレイのフィルター処理 アクション(Filter array)
「アレイのフィルター処理」アクションは、文字通り、条件に合う要素だけ残して配列(アレイ)を絞り込むアクションです。オブジェクトに対しては使用できない点に注意しましょう。
今回も「3.1.2. アレイから特定のデータを取得する」で使用したサンプルデータをベースに考えてみます。「差出人」に「作成:アレイ」から得られる「出力」を入れます。
次に、選択アクションと同様の考え方で item() を使って、フィルター条件を設定していきます。今回は、商品名が「〆サバ」のデータ行のみを抽出してみます。
実行結果を確認すると、商品名に「〆サバ」を含んでいる行を抽出できました。実務の文脈で考えると ID やステータスといったものを基準にするのがほとんどだと思います。色々な条件でフィルターできるので試してみると理解が進むでしょう。
3.5. JSON の解析(Parse JSON)
「JSON の解析」アクションは、具体例から理解する方が気楽だと思います。これまで「データ操作」で JSON を加工して来ましたが、それには 「加工後のデータを Outlook メール、Teams 投稿、SharePoint リストへの登録(更新)に活用したい」 という思惑があるはずです。
しかし、加工後のデータは、あくまでも JSON という「情報のかたまり」に過ぎないため、各項目の該当する列に分割して保存するといったことができません。そういった時に活躍するのが「JSON の解析」アクションです。
このアクションを配置するよりも前に、加工の工程を全て終えた JSON データの出力結果をコピー元に取っておきます。
今回は「作成:アレイ」を使用していますが「アレイのフィルター処理」や「選択」アクションの時でも同様の手順を踏みます。
次に「コンテンツ」と書かれている箇所に、加工が完了したアレイ(あるいはオブジェクト)を動的なコンテンツとして入れた後で「サンプルから生成」と書かれてあるボタンをクリックします。
「サンプルから生成」をクリックすると、別ウィンドウで「サンプル JSON ペイロードの挿入」と表示されるので、その中に、先ほどコピー元に取っておいた加工後のデータを全て貼り付けて「完了」をクリックします。
すると、先ほどまで空欄だった「スキーマ」と書かれてあるボックスに、呪文のような文字が入力されます。これで作業自体は完了です。
あとは、JSON の解析アクションで得られたデータを用いて後続アクションで活用するだけです。
余談ながら、この「JSON の解析」アクションは、エラーに苦しめられる人が後を絶たないような気がします。その時は「失敗」のエラーメッセージを熟読するのが大切です。英語で書かれているので抵抗があるかもしれませんが、人工知能などに問いかけるだけでも「こういうエラーメッセージですよ」と教えてくれます。
このアクションを使った時に生じるエラーは ワンパターン であることが多いです。
- コンテンツで「アレイ」を指定しているのにペイロードにはオブジェクトを貼り付けてしまっている
- 文字列型の入るべき箇所に数値型が入っている
- 値が空欄になっているケースがある
といったようなことばかりです。そういう時は、if() やデータ型を変換する関数(string, int, formatDateTime 等)を使用しながら適切な形に直していくことが求められます。
いずれにせよ、エラーメッセージを熟読し、その内容を検索エンジンで調査すると何かしらの記事にヒットすると思うので、そこで微調整をしてみると良いでしょう
結
JSON に慣れる最大のコツは、細部の暗記ではなく「構造の見立て」を先に固めることです。欲しい情報を含む最外側が { } なのか [ ] なのかを判断し、欲しい値までの道順は何か、配列から1件だけ必要なのか全件処理なのか…といった「やりたいこと」を落ち着いて定めていくことで、Power Automate のアクション選択はパターン化します。
本稿の内容は、上で引いた記事の「SharePoint に HTTP 要求を送信します」でも使います。当アクションが返す JSON を「選択」アクションと「作成」アクションで加工し、通知内容へと繋ぐようなフローを構築できるようになるための基礎となるはずです。
...もう今どきは AI に聞けばなんでも解決してくれるよなあ、いつまで JSON が使われるのかなあ、と思いながらも書いてみました。昨今、AI Builder の文脈でも JSON データの操作は頻出しているような気がしていますので、何かしらの学びの材料になれば幸いです。
また、筆者が今よりもさらに経験の浅い時期の話ではありますが、先人たちの記事には大変お世話になりました。この場を借りて深く御礼を申し上げます。
Enrichment (Acknowledgement)
- Hiro さん, 2020, 『Select アクションで配列を変換する』
- Hiro さん, 2020,『Apply to each のパフォーマンス改善 (配列加工の場合)』
- Hiro さん, 2020,『JSON と仲良くなるために (1)』
- Hiro さん, 2020,『JSON と仲良くなるために (2)』
- Hiro さん, 2020,『JSON と仲良くなるために (3)』
- Hiro さん, 2020,『JSON と仲良くなるために (4)』
- Hiro さん, 2020,『JSON と仲良くなるために (まとめ)』
- Hirofumi Ota さん,『Power Automate の「JSON の解析」でよくあるエラーを回避する』
- Makoto Maeda さん, 2023,『JSON 解析の基本 【Power Automate】』
- MiyakeMito さん, 2021,『JSON の読み解き方』
- MiyakeMito さん, 2022,『JSON は怖くない』
- 出戻りガツオ さん, 2024,『初心者向け】Power Automate データ操作 練習帳』
- ふらり@ ROBO BOY さん, 2024,『Power Automate で 集合!』































