Power Automate クラウドフローからJSON文字列を渡してPower Apps で値として利用する方法
最近ParseJSON関数を使用したアプリを構築しまして、少し手間取ったのでメモを残しておこうと思います。
ParseJSON 関数について
この関数は、JSON形式の文字列、(例えばこういうもの{ "Text": "this is text" })を読み取り、型を認識した値として扱えるようにしてあげる関数です。扱えると非常に便利です。
ParseJSONができるとなにがうれしい?
これができると、例えば Power Automate のクラウドフローから文字列でJSON情報を受け取り、Power Apps で扱いやすい形に簡単に変換ができ、アプリ作成が捗ります。他のことにも利用できそうです。
クラウドフローからJSONオブジェクト受け取れるような・・・?
応答アクションを使用して受け取ることが可能ですが、そのアクションを使うには有償の Power Apps ライセンスが必要となります。文字列を変換する方式であれば、標準機能のみで実装することが可能です。
準備
執筆時点でこの機能は実験的な機能で、既定では無効化されています。利用するには、設定から有効化する必要があります。
基本的な使い方
実際の使用例を見てみましょう。例えばこんな感じのJSONの変換は
{ "Text": "this is text" }
↓このように行なえます。
Text(ParseJSON(JSONテキスト).Text)
ParseJSON()でパースした後、Textプロパティを参照して、それに対してText()で文字列変換しています。なぜ変換するかというと、ParseJSON()するとプロパティ(フィールド)参照できるようにはなる※のですが、型までは判断してくれないんですね。なので、この値はこの型ですよ、というのを明示的に教えてあげないといけません。そのような理由からちょっと特殊なことをしています。
※自動予測はでてこないので、すべて手入力します。
上記はテキスト型でしたが、他の型も基本的に同じことをしていきます。いくつかのメジャーな型の例を見ていきましょう。まず準備として、クラウドフローを作成し、JSONテキストを返すようにします。
クラウドフローからのJSONテキスト
これをアプリから呼び出し、一度変数に格納しています。
UpdateContext({ locJsonText:JsonText.Run()})
下記は、上記変数に対してそれぞれ変換した例です。
// 文字列型の変換
Text(ParseJSON(locJsonText.text).Text)
// 数値型の変換
Value(ParseJSON(locJsonText.number).Number)
// Bool型の変換
Boolean(ParseJSON(locJsonText.bool).Bool)
// 日付型の変換
DateValue(ParseJSON(locJsonText.date).Date)
// レコード型の変換
{Title:Text(ParseJSON(locJsonText.record).Title),Value:Text(ParseJSON(locJsonText.record).Value)}
// テーブル型の変換
ForAll(Table( ParseJSON(locJsonText.table)),{Title:Text(ThisRecord.Value.Title),Value:Text(ThisRecord.Value.Value)})
文字列型、数値型、Bool型、日付型についてはそんなに難しくないですね。ParseJson()して、値変換にかけるだけです。というかそもそも出力選択で選べますので、こんな意味のわからないことをする人はいない気もしますが、次の本筋のレコード変換で必要な知識です。
問題はレコード型とテーブル型です。少し難しいですね。
レコード型のParseJSON()
まずはレコード型から、少し見やすくしてみます。
{
Title:Text(ParseJSON(locJsonText.record).Title),
Value:Text(ParseJSON(locJsonText.record).Value)
}
解説
レコード型なので、それぞれのフィールドの値毎に値変換をして上げる必要があります。都度ParseJSONをするのが気持ち悪い場合は、With関数を使用するなどで回避できるかもしれません。
テーブル型のParseJSON()
テーブル型は更に複雑です。
ForAll(
Table(ParseJSON(locJsonText.table)),
{
Title:Text(ThisRecord.Value.Title),
Value:Text(ThisRecord.Value.Value)
}
)
解説
こちらはForAll()をつかってテーブルをループさせています。ループ内でレコードに対しての変換と同じことをして、値変換しています。一つ一つ整理してみると、やってることは積み重ねですね。
まとめ
このようにJSON文字列からParseJSON()を使用することで、アプリで扱いやすい形に変換することが出来ます。有償ライセンスが使えない環境の方には有用な関数と思いますので、是非覚えて置きたい関数に思います。
フォローしませんか?
お気軽にご依頼・ご相談ください