はじめに
Hiroさん(@mofumofu_dance)のこちらのツイートをきっかけにPower AppsでJSONのパースができるようになったことを知りました。
I believe This is long-awaited feature for ALL app makers!!!!
— Hiro (@mofumofu_dance) 2022年9月7日
Support Parse JSON action in Power Apps without any RegEx technique or Split workaround!!!
This is game changing!!!!!!!!! #PowerApps pic.twitter.com/EeGTDEus9h
待っていました!!な機能です!!!!
個人的にもとても興味があった機能ですので早速試したのでそのときのメモをこのブログで纏めます。
前提条件
この機能はまだPreview機能なので2022/09/07(水)現在、日本の環境では利用できない機能でした。
もしこの機能をいち早く試したい場合は、「プレビュー(米国)」の環境を作成して、そこでお試しください。
勘違いしていました! Hiroさんからご指摘いただきました。
わざわざ新しい環境作成しなくともよいようです。
設定 > サポート > 作成バージョン
より、現在選択できる最新バージョンの「3.22091.8」を選択してください。
これで、アプリを読み込みなおせばPerseJSONが利用できます。
バージョン変更の詳細はこちら。
ParseJSONを試してみる
ParseJSON function and untyped objectsの有効化
PerseJSONを試す前にこの設定をオンにしてください。
設定 > 近日公開の機能 > 実験段階
から設定可能です。
ここはまだ日本語化されていませんね。
アプリで動作を試してみる
答え合わせがしやすいように
という感じで試しました。
コレクションの作成はこんな感じ。
ClearCollect( col, {Name: "Bob", Age: 26, Gender: "男"}, {Name: "Lily", Age: 24, Gender: "女"}, {Name: "John", Age: 32, Gender: "男"} )
JSONの作成は以下。
Set(colJson, JSON(col, JSONFormat.IndentFour))
このJSONをラベルに表示させたのが、画面左下のJSONですね。
JSONはこんな感じ。
[ { "Age": 26, "Gender": "男", "Name": "Bob" }, { "Age": 24, "Gender": "女", "Name": "Lily" }, { "Age": 32, "Gender": "男", "Name": "John" } ]
さて、肝心のGalleryの設定です。
ParseJSON
関数では返された結果のデータ型はUntypedObjectになるらしく自身で明示的に型指定する必要があるようです。
ParseJSON(colJson)
で行った結果、このJSONですと、Table型となるはずなので、Table型に指定します。
Gallery.Items
Table(ParseJSON(colJson))
Gallery内にJSONの値である「Age」「Gender」「Name」を表示させていきたいと思います。
これまでのGallery内にItems
に設定したオブジェクトの値を表示させるやり方の感覚からいくと、ThisItem.Name
となるような気がしますが、これは違います。
Table(ParseJSON(colJson))
の中身をみてみると、以下のようになっています。
Valueにそれぞれ値が含まれているっぽいですね。
また、これらの値も型をこちらで明示してあげる必要があるようです。
よって「Name」を表示したい場合は以下のようになります。
Text(ThisItem.Value.Name)
「Name」はテキスト型ですのでText関数を用います。
次に「Age」ですが、これは数値型なので
Value(ThisItem.Value.Age)
とします。
Text(ThisItem.Value.Age)
ですと、型が異なりエラーになるので気を付けてください。
「Gender」は「Name」と同様テキスト型なので
Text(ThisItem.Value.Gender)
となりますね。
この設定をする際の注意点ですが、ThisItem.Value.
と入力してもインテリジェンス(入力候補)が効かないので自身で表示させたいJSONのキー値を入力する必要があります。
これはプレビュー外れたりしたらできるようになってくれないですかね?
できるようになると嬉しいですね。
JSONの中に配列があるパターン
さて先ほどまではJSONの基本形。
今度はJSONの中に配列があり、またデータによっては存在しないスキーマがある場合で試してみます。
検証するJSONはこんな感じ。
[ { "Age": 26, "Gender": "男", "Name": "Bob", "ShipTo": { "Name": "Keito", "address": "hogehoge", "Cost": 1000 } }, { "Age": 24, "Gender": "女", "Name": "Lily" }, { "Age": 32, "Gender": "男", "Name": "John" } ]
ShipTo
というキーを1つ目のデータにだけ追加してあります。
これをGaleryの中にGalleryを配置して表示させます。
ShipTo
はオブジェクトではなく配列です。
なので先ほどGalleryのItems
に指定したようにTable関数で型指定するのではなく、レコード型だと明示します。
レコード型だと明示する関数はないので[]
で囲ってあげます。
Gallery.Items
[ThisItem.Value.ShipTo]
あとはこの配列内の値を表示させるだけですが、ここは先ほどと同じやり方ですね。
「Name」ですと
Text(ThisItem.Value.Name)
みたいな感じで、型に合わせて型を明示的に宣言してあげます。
実際に設定した画面がこんな感じ。
Galleryの中のGalleryは見やすいように枠を付けています。
また、「Name: ~」みたいに表示されているのは、わかりやすくテキストを表示するように設定したからですね。
$"Name: {Text(ThisItem.Value.Name)}"
おわりに
待ちに待ったPower AppsでJSONをパースできる機能がキタ―――(゚∀゚)―――― !!
これでPower Apps内でJSONを扱えるようになりましたね。
もうこれでMatchAll関数とか使って文字を分割したり、Power Automateに一度データを渡してカンマ区切りとかにして無理やりJSONの値を取得するみたいなことをしなくてよくなります。
具体的な利用用途ですが、例えば現在だとPower AutomateからPower Appsにデータを渡すときにCollection形式でデータを渡すことはできないです。
しかし、JSON形式でデータを渡してあげることはできますので、Power Automate側でごにょごごにょしたデータをJSON形式でPower Appsに渡し、Power Apps側でパースして取り扱う。
みたいなことができるようになります。
他にもデータソース内にJSON形式のデータを入れる。というデータ設計の選択肢がなしではなくなる。
というのもでかいですね。
私が以前紹介したPower AppsでRedo & Undo機能を実装するやり方もこれ使えばもう少し簡単になりそうなので、改良版また書きたいですねー