MoreBeerMorePower

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

Power Automate で JSONの値を取得する 3 (+1) の方法

もういろんな方が書かれている内容だと思いますし、私も部分的に一度書いていますが、知識もアップデートされているので改めて纏めようと思います。

JSONオブジェクト内の値を取得する場合、Power Automate でよくやるのは 対象を "JSONの解析" アクションを利用して構造を解析し、後続ステップで動的コンテンツから選択するというアプローチです。

もちろんこれができるケースであればそれに越したことはありません。また、JSON内でプロパティ名の重複がある場合 (例えば以下のJSONでいう firstname のようなケース) では、"JSONの解析”アクションのスキーマを弄ってあげることで動的コンテンツからの選択・見分けが容易になります。

Ref. : Power Automate の JSON の解析で値に名前を付けて分かりやすくする – idea.toString();

{
    "isbn": "123-456-222",
    "author": {
        "lastname": "Doe",
        "firstname": "Jane"
    },
    "editor": {
        "lastname": "Smith",
        "firstname": "Jane"
    },
    "title": "The Ultimate Database Study Guide",
    "category": [
        "Non-Fiction",
        "Technology",
        "Science"
    ]
}

一方で、慣れてくると/JSONの解析をうまく利用できないケースだと、Power Automate の 式を使って JSON 内の各値にアクセスすることがあります。

今回は上のJSONを例として、各値にアクセスする 3 (+1) の方法を紹介します。

1. 1階層目へのアクセス (入れ子を無視)

難しいこと考えずにまずは1階層目 (isbn, author, editor, title, category) へのアクセスです。上のJSONを "sampleObject" という名前の変数に格納している前提で進めます。

これらの値を取得する場合、以下の3つの方法が利用できます。

  1. variables('sampleObject').author (ドットのあとにプロパティ名)
  2. variables('sampleObject')['author']  (何もなしで ['プロパティ名'] )
  3. variables('sampleObject')?['author'] (?付きで ['プロパティ名'] )

ちなみに"JSONの解析" アクションの結果で得られる動的コンテンツでは、body('Parse_JSON')?['author'] という形式なので、タイプで言えば3番目になります。

上の例ではいずれも実行結果は同じです。

また、意外と知られていないようなのですが、プロパティ名は大文字小文字の区別をしません。(authorでもAuthorでもAUTHORでもいい)

プロパティ名ってサービスによって先頭が大文字だったり、真ん中が大文字だったりと結構ばらつきありますよね。でもPower Automateの式としてはここを意識する必要はありません。

じゃあこの3つの違いは? というと、取得できなかった場合のアクションの挙動です。つまり例にあるJSONでスッポリと"author"が抜けている場合。

この時それぞれのアクションは以下のように振舞います

  1. variables('sampleObject').author → アクションは失敗 (エラー)
  2. variables('sampleObject')['author']  → アクションは失敗 (エラー)
  3. variables('sampleObject')?['author'] → アクションは成功 (ただし値は null)

ということで値が入っていることが確定しているのであれば (必須列のようなケース)、どれでも問題ありません。

ケース3が万能のように見えますが、ケース3は、『"author"はあるけど null』である場合と『"author"がそもそもない』場合を区別できないのでそこは注意が必要です。

2階層目へのアクセス

2階層目 (author下のfirst/lastname, editor下のfirst/lastname) へのアクセス方法を見ていきます。

これらの値を取得する場合は先ほどと少し変わって、以下の4つの方法が利用できます。

  1. variables('sampleObject').author.lastname (ドットのあとにプロパティ名)
  2. variables('sampleObject')['author']['lastname']  (何もなしで ['プロパティ名'] )
  3. variables('sampleObject')?['author']?['lastname'] (?付きで ['プロパティ名'] )
  4. variables('sampleObject')?['author/lastname'] (?付きで ['プロパティ名/プロパティ名'] )

もちろんこれらはすべて同じ結果を返してくれます。4番目のケースはあまり見ないかもしれません。プロパティ名をスラッシュで続けてあげることでも深い階層のデータにアクセスできます。

エラーになる/ならないは先ほどと同様です。ケース1,2 ではアクションが失敗している一方で、ケース3,4はアクションが成功してnullが返却されます。

  1. variables('sampleObject').author.lastname → アクションは失敗 (エラー)
  2. variables('sampleObject')['author']['lastname']  → アクションは失敗 (エラー)
  3. variables('sampleObject')?['author']?['lastname'] → アクションは成功 (ただし値は null)
  4. variables('sampleObject')?['author/lastname'] → アクションは成功 (ただし値は null)

大文字小文字の区別はケース4だけ確認してみましょう。

最初のプロパティと後ろのプロパティの先頭をそれぞれ大文字にしましたが、特に影響はありませんでした。(今までめっちゃ気にしてたのなんだったんだ・・・)

配列の場合

2階層目が配列の場合、 (categoryが配列になっている) にはどうかというと、少しパターンが限られます。

  1. variables('sampleObject')['category'][0]  (何もなしで ['プロパティ名'][順番] )
  2. variables('sampleObject')?['category']?[0] (?付きで ['プロパティ名']?[順番] )
  3. variables('sampleObject')['category'].[0] (組み合わせで ['プロパティ名'].[順番] )

値が存在しない場合のアクションの挙動も先ほどと同様に、 ?[0] を指定すれば成功、それ以外は失敗します。

まとめ

今回は Power Automate で JSON の値を取得する方法をいくつかご紹介しました。

基本的には variables('...') ? ['プロパティ名'] ? ['プロパティ名'] と、 "?"を使ってアクセスすると覚えておけば問題ないと思います。

ただし『プロパティ自体はあるけど 値がnull』である場合と『対象のプロパティがそもそもない』場合を区別したいようなケースでは注意が必要、他の方法をとった方がよいでしょう。