コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Power AppsでJSONがパースできるようになりました!(Preview)


スポンサードリンク

はじめに

Hiroさん(@mofumofu_dance)のこちらのツイートをきっかけにPower AppsでJSONのパースができるようになったことを知りました。

待っていました!!な機能です!!!!

個人的にもとても興味があった機能ですので早速試したのでそのときのメモをこのブログで纏めます。

前提条件

この機能はまだPreview機能なので2022/09/07(水)現在、日本の環境では利用できない機能でした。
もしこの機能をいち早く試したい場合は、「プレビュー(米国)」の環境を作成して、そこでお試しください。

勘違いしていました! Hiroさんからご指摘いただきました。

わざわざ新しい環境作成しなくともよいようです。

設定 > サポート > 作成バージョン

より、現在選択できる最新バージョンの「3.22091.8」を選択してください。

これで、アプリを読み込みなおせばPerseJSONが利用できます。

バージョン変更の詳細はこちら。

docs.microsoft.com

ParseJSONを試してみる

ParseJSON function and untyped objectsの有効化

PerseJSONを試す前にこの設定をオンにしてください。

設定 > 近日公開の機能 > 実験段階
から設定可能です。

ここはまだ日本語化されていませんね。

アプリで動作を試してみる

答え合わせがしやすいように

  1. Collection作成
  2. 1で作成されたCollectionをもとにJSONを作成
  3. 2.で作成されたJSONをGalleryに表示

という感じで試しました。

コレクションの作成はこんな感じ。

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機能を実装するやり方もこれ使えばもう少し簡単になりそうなので、改良版また書きたいですねー

koruneko.hatenablog.com


スポンサードリンク