MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

JSONと仲良くなるために (4)

すこしPower Automateが入ってきます

(1)ではJSONのルールを、(2)ではデータ型に関する説明、(3)では与えられたJSONの構造をどう読んでいくかを解説してきました。

今回はすこし Power Automate に寄せて、与えられたJSONの、特定の値を取得するにはどうするかを見ていきます。

準備

準備として、Power Automate の「作成」アクションに以下のJSONを入れます。これだけでオブジェクト型のJSONを定義できます。

{
    "本人情報": {
        "氏名": "慈英 孫",
        "カナ": "ジエイ ソン"
    },
    "年齢": 35,
    "家族構成": [
        {
            "氏名": "慈英 妻",
            "続柄": ""
        },
        {
            "氏名": "慈英 子",
            "続柄": ""
        }
    ]
}

f:id:mofumofu_dance:20200904152328p:plain

※「作成」アクションの結果 (できるJSON) には outputs('作成') でアクセスできます。

ケース1 : シンプルな値の取得

上のJSON35という値を取得したいとしましょう。この時は何を指定すればいいのか。

前回のJSONの読み方と同様に、インデントに沿ってみていきます。

  1. 1つインデントした位置に含まれているキー/識別子は 本人情報, 年齢, 家族構成の3つ
  2. 35 は 識別子 = "年齢" に対応した値 なので、outputs('作成')?['年齢']

で取れます。

f:id:mofumofu_dance:20200904152841p:plain

JSONオブジェクトの特定のキー/識別子の値 にアクセスするには

outputs('作成') ? ['キー/識別子名']

を指定しましょう。識別子の前後にシングルクォーテーションが必要なことに注意してください。

余談ですが、"?"を"の"と読み替えると理解しやすいかもしれません。 outputs('作成')はJSONの全体なので、「JSON全体識別子=年齢 の値」のように読めます。

ケース2 : 入れ子になった値の取得

今度は 慈英 孫という文字を取得するケースを考えます。

取得したい値が、先ほどの 35 よりも内側、「JSON全体 の 本人情報 の 氏名」の値です。この場合には下図のように辿っていきます。

f:id:mofumofu_dance:20200904154156p:plain

入れ子になっている場合にはJSON全体 (outputs('作成'))から見て、2回識別子を指定してあげる必要があります。

outputs('作成') ? ['キー/識別子名1'] ? ['キー/識別子名2']

のように、探していくルートを指定しましょう。

ケース3 : 配列の中の値取得

今度は 慈英 子を取得したい場合を考えます。先ほどと同様に、慈英 子は "家族構成" の内側に入っているのですが、気を付けなければいけないのは家族構成は配列 という点です。

つまり、先ほどと同じ調子で、outputs('作成')? ['家族構成'] ? ['氏名']としても"慈英 子"に到達できないのです。考えてみれば当然で、配列は複数の箱からできているので、まずはどこの箱かを指定しなければならないですよね。

f:id:mofumofu_dance:20200904160110p:plain

では配列の箱はどうやって指定するのか。配列は順番を指定して中を覗きます。

配列は先頭から順に0から始まる番号がついていて、これを使って中の値にアクセスできるようになっています。

今回の例では、慈英 子は (0始まりなので)1番目 に含まれています。このような場合には ?[1] ( ?と[番号]。シングルクォーテーションはいらない ) で覗く先を指定します。

f:id:mofumofu_dance:20200904163011p:plain

注意

JSONでは1件のみの配列とオブジェクトは明確に区別されます - [ { "氏名" : "慈英 孫"} ]{ "氏名" : "慈英 孫"}は構造が違う。そのため、たとえ1件しか入っていない配列であったとしても、必ず配列の箱の番号を指定してから、中の値を見に行くようにしましょう。

ここでは ?['氏名']ではエラーになって、?[0]?['氏名'] とする必要があります。

まとめ

今回は Power AutomateでJSONの特定の値を取得するための道筋・考え方を紹介しました。

考え方は以下の通りです。

  1. 特定の識別子の値を取得したいなら ?['識別子']
  2. 配列の特定の行の値を取得したいなら ?[順番] ※ただし0から数える
  3. 配列の中にオブジェクトがある場合には、まず配列の順番を指定してから、中の識別子を指定 ?[順番] ?['識別子']

この3つのルールさえ押さえておけば、あとは順々に構造を紐解いていくだけなので、Power Automateで実際に得られるJSONを使って練習してみてください。