Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JSONについて

MiyakeMito
September 17, 2022

 JSONについて

MiyakeMito

September 17, 2022
Tweet

More Decks by MiyakeMito

Other Decks in Technology

Transcript

  1. JSONと Power Automateと Power Apps 気ままに勉強会 #32 1

  2. 今日の目標 JSONと配列 コワクナイヨー 2

  3. アジェンダ Power AutomateでJSONや配列と仲良くなると JSONとは Power Automate での JSON Power Apps

    での JSON 3
  4. Miyake Mito @MiTo60448639 https://qiita.com/MiyakeMito 株式会社アイシーソフト Technical Manager www.icsoft.jp https://speakerdeck.com/ miyakemito

    4
  5. Power Automate と Power Virtual Agents で ゲームを作ってます ⚫ オセロ

    ⚫ 神経衰弱 ⚫ どうぶつしょうぎ ⚫ WORDL 5
  6. 本日の参考サイト 6 ▪ Hiroさん JSONと仲良くなるために (まとめ) https://mofumofupower.hatenablog.com/entry/2020/09/04/190039 Power Automate で

    JSONの値を取得する 3 (+1) の方法 https://mofumofupower.hatenablog.com/entry/json_value Convert JSON data in Power Apps without Premium license https://mofumofupower.hatenablog.com/entry/2022/09/07/201957 ▪ コルネさん Power AppsでJSONがパースできるようになりました!(Preview) https://koruneko.hatenablog.com/entry/2022/09/07/195521
  7. 免責事項 当スライドは、 2022年9月現在のバージョンでの情報です 今後のアップデート等により、 仕様変更する可能性があります また、私の見解による内容が含まれます 間違いなどありましたらご指摘ください 7

  8. Power Automateで JSONや配列と 仲良くなると

  9. Power AutomateでのJSON トリガーの Input と Output は JSON です 9

  10. アクションの Input と Output も JSON です 10

  11. どう活用できるの? 目的の値がダイレクトに取得できる triggerBody()?['events']?[0]?['message']?['type'] 11

  12. 実行速度が遅い Apply to each を利用したくない時 outputs('開始して承認を待機')?['body']?['responses']?[0]?['responder']?['email'] ダイレクトにコンテンツのを取得することで ループ処理を回避できます 承認者は一人なのに、 自動でApply

    to each になってしまう 12
  13. ➢ 例えば、SPOの「アイテムが作成または変更されたとき」から、 「作成」時のみを条件にしたいとき トリガーの実行条件を絞りたいとき トリガーの実行条件を 設定できます ▪ トリガーの実行条件を絞れるので、フローの実行回数が節約できます @equals(triggerBody()?['Created'],triggerBody()?['Modified']) 13

  14. Adaptive Cards のカスタマイズ JSONの構造が分かると、 カスタマイズし放題です 14

  15. JSON とは

  16. JSONとは { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.",

    "面積": 9834000, "人口": 331003000, "主要都市": [ {"名前": "ニューヨーク", "人口": 17799861}, {"名前": "ロサンゼルス", "人口": 11789487}, {"名前": "シカゴ", "人口": 8307904}, {"名前": "ホノルル", "人口": 718182} ] }, "言語": [ "英語", "フランス語", "ハワイ語", "スペイン語" ], "渡航歴": true } 16 ◼ 「JavaScript Object Notation」の 略称で、JavaScript オブジェクト表 記法によるデータ記述形式 ✓ テキストベースで軽量なデータ ✓ 人間にとってわかりやすい構造 ✓ 記載ルールが決まっているためコン ピュータも読み書きしやすい ✓ 様々なプログラム言語で利用できる ✓ REST APIで扱われる形式
  17. 名前,地区,首都,面積,人口 アメリカ合衆国,北アメリカ,ワシントンD.C.,9834000 イタリア共和国,ヨーロッパ,ローマ,302780,60462000 日本,アジア,東京都,377973,1261406099 17 CSV <国> <名前>アメリカ合衆国</名前> <地区>北アメリカ</地区> <地理>

    <首都>ワシントンD.C.</首都> <面積>9834000</面積> <人口>331003000</人口> </地理> </国> XML { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000 } } JSON JSON は ✓見やすく ✓書きやすく ✓加工しやすい のです 他のテキストフォーマットデータと比較
  18. JSONのルール:その1 1. 「キー」と「値」で構成され、コロンで繋げます 2. 「キー」はダブルクオーテーションで囲みます 3. 「キー:値」はカーリーブラケットで囲みます { "名前" :

    "アメリカ合衆国" } 18
  19. { "名前": "アメリカ合衆国", "地区": "北アメリカ", “地理": { "首都": "ワシントンD.C.", "面積":

    9834000, "人口": 331003000 }, "言語": [ "英語", "フランス語", "ハワイ語", "スペイン語" ], "渡航歴": true } JSONのルール:その2 4. 複数「キー:値」が並ぶときは、カン マで区切ります 5. 「値」には以下の型が設定できます ① 文字列 ② 数字 ③ Boolean型(true/false) ④ オブジェクト ⑤ 配列 ⑥ null 今のところ null は [JSONの解析]アクションで エラーになります 19
  20. JSONのルール:オブジェクト ➢ 「キー:値」はオブジェクト ➢ 「キー」に対し「キー:値」(オブ ジェクト)を「値」として設定できる ➢ オブジェクトを入れ子にすると構造は 階層化しますが、情報がグループ化さ れ意味付けがされます

    ➢ データを取得する際は、 [‘上位キー’]⇒[‘下位キー’] と階層を ネストしながら指定します { "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000 } } 21 JSONを階層化し、 複雑にする要因 その1
  21. 配列とは • 変数が複数つながり、同一型の複数データを連続的に並べたデー タ構造です • それぞれの箱は、配列の「要素」と呼ばれます • また配列の要素には、「添え字」という番号が割り当てられてい ます •

    要素の数は動的です 変数 0 1 2 3 4 5 22
  22. JSONのルール:配列 ➢ ブラケットで囲み、各アイテム(要素)はカンマで区切ります ➢ データを取得する際は、添え字(何個目のデータ)を指定します ➢ Power Automateでは添え字を0から、Power Appsでは1から数えます ➢

    各要素は、オブジェクトで指定することも可能です ➢ 文字列も複数文字の連続(=配列)として解釈できます "言語": [ "英語", "フランス語", "ハワイ語", "スペイン語" ] "主要都市": [ {"名前": "ニューヨーク", "人口": 17799861}, {"名前": "ロサンゼルス", "人口": 11789487}, {"名前": "シカゴ", "人口": 8307904}, {"名前": "ホノルル", "人口": 718182} ] 23 JSONを階層化し、 複雑にする要因 その2
  23. JSONの階層化 { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.",

    "面積": 9834000, "人口": 331003000, "主要都市": [ {"名前": "ニューヨーク", "人口": 17799861}, {"名前": "ロサンゼルス", "人口": 11789487}, {"名前": "シカゴ", "人口": 8307904}, {"名前": "ホノルル", "人口": 718182} ] }, "言語": [ "英語", "フランス語", "ハワイ語", "スペイン語" ], "渡航歴": true } こんなJSONから、 Power Automate と Power Apps で 目的の「キー」に対する 値を取得する方法を説明 します 24
  24. Power Automate での JSON

  25. Power Automate での JSON ▪ JSON の作成 ➢ 変数等にJSON を入力する

    ➢ json()などの関数 ▪ JSON を参照する ➢ 「JSONの解析」アクションで、動的にコンテンツが取得できる ➢ JSON から、ダイレクトにコンテンツが取得できる 27
  26. JSON を作る ① ▪ 「データ操作」-「作成」 outputs('作成')?['地理']?['主要都市']?[0]?['名前'] 「JSONの解析」なしでも ↑のようにで取得できます 28 outputs('作成')?[0]

  27. JSON を作る ② ▪ 「変数を初期化する」 全体が { } で囲まれている ⇒

    オブジェクト 全体が [ ] で囲まれている ⇒ アレイ 29 variables('JSONObject')?['地理']?['首都'] variables('JSONObject')?[0]?['地理']?['首都']
  28. JSON を作る ③ ▪ 関数 30 array() createArray() ➢ 配列を作る

    range() ➢ JSON を更新する addProperty() setProperty() removeProperty() json() json(concat(…))
  29. 目的の値を取得 – JSON の解析 「データ操作」-「JSONの解析」でJSONテキストの各プロ パティを動的なコンテンツとして取得できます 31 項目が参照できる JSON ペイロード

    を貼付け 変数の型も識別 してくれます
  30. 目的の値を取得 - アクション JSON Pretty Linter (https://lab.syncer.jp/Tool/JSON-Viewer/) ① 実行履歴の未加工出力の表示を JSON

    Pretty Linter へ貼付けする 32
  31. outputs('開始して承認を待機’)? ['body']?['responses']?[0]?['responder']?['displayName'] ② ビューアーで[Path]を有効化し、 目的の値のパスをクリック object['body']['responses'][0]['responder']['displayName'] ③ 「Object」 を 「outputs('Action名')?

    」に置換する ④ ブラケット間に”?”を挿入 33 オプション
  32. trigger()?['body']?['body']?['content'] ③ ブラケット間に”?”を挿入 目的の値を取得 - トリガー編 ① 実行履歴の 未加工出力の表示を JSON

    Pretty Linter貼付けする ② 「Object」を「trigger('Trigger名')?」に 置換する object['body']['body']['content'] 34 オプション
  33. variables('CountryInformation')?[0]?['名前'] object[0]['名前'] ② 「Object」を「variables('変数名')? 」に置換する ③ ブラケット間に ”?” を挿入 目的の値を取得

    - 変数編 ① 変数で入力した値をJSON Pretty Linter貼付けする 35 オプション
  34. 配列を参照する ① ▪ 配列から要素を一つだけ取り出す outputs('アクション名')?[0] ➢ 添え字で指定する 添え字を指定するときは 「 '

    ' 」(シングルクオーテーション)で囲まない 36 first() ➢ 最初の要素を取得する last() ➢ 最後の要素を取得する
  35. 配列を参照する ② ▪ 配列から複数の要素を取り出す ➢ Apply to each 37 ➢

    関数 skip() take() intersection() union() …など item() でも可 split() ➢ [データ操作]コネクタ
  36. 目的の値を取得 38 { "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都":

    "ワシントンD.C.", "面積": 9834000, "人口": 331003000, "主要都市": [ {"名前": "ニューヨーク", "人口": 17799861}, {"名前": "ロサンゼルス", "人口": 11789487}, {"名前": "シカゴ", "人口": 8307904}, {"名前": "ホノルル", "人口": 718182} ] outputs('Action名') or trigger('Trigger名') or variables('変数名') ?['地理'] ?['主要都市'] ?[2] outputs('Action名')?['地理']?['主要都市']?[2]?['人口'] ?['人口'] 階層のつなぎとなる"?"は、 "."(ドット)や"/"(スラッシュ)や 無しでも記載できますが、動作が変 わります。詳しくは https://mofumofupower.hatenablog.co m/entry/json_value ➢ シカゴの 人口は?
  37. Power Apps での JSON

  38. Power Apps での JSON ▪ JSON の作成 ➢ JSON() 関数で、Collection

    や 変数(レコード型、テーブル型)を JSON に変換できる ▪ JSON を参照する ➢ Power Automate で 解析する ➢ JSON を ParseJSON() 関数で解析(実験的な機能) ➢ IsMatch(),MatchAll()と正規表現で解析する方法もある ➢ カスタムコネクタの応答 は Collection(TableやRecord)で扱える 40
  39. Power Apps で JSON を作成 ▪ JSON() 関数 – Collection

    や 変数(テーブル、 レコード)を JSON に変換できる Set( txtJSON, JSON( colJSON )) ClearCollect( colJSON, { 国: "アメリカ合衆国", 地理: { 首都: "ワシントンD.C.", 面積: 9834000, 人口: 331003000 } }, { 国: "イタリア共和国", 地理: { 首都: "ローマ", 面積: 302780, 人口: 60462000 } } ); [{"国":"アメリカ合衆国","地理":{"人口":331003000,"面積 ":9834000,"首都":"ワシントンD.C."}},{"国":"イタリア共和国"," 地理":{"人口":60462000,"面積":302780,"首都":"ローマ"}}] Power Automate へ、データ構造を維持しながら パラメータを渡すことができます 41
  40. JSON関数の動き ➢ 配列 ➢ レコード [ "値1", "値2", "値3" ]

    JSON() 関数の結果 { 列1:"値1", 列2:"値2", 列3:"値3" } 1つまたは複数の「キー:値」で構成 ➢ テーブル { 列1:"値1", 列2:"値2", 列3:"値3" }, { 列1:"値4", 列2:"値5", 列3:"値6" } 複数のレコードで構成 42 [ { "Value": "値1" }, { "Value": "値2" }, { "Value": "値3" } ] [ { "列1": "値1", "列2": "値2", "列3": "値3" } ] [ { "列1": "値1", "列2": "値2", "列3": "値3" }, { "列1": "値4", "列2": "値5", "列3": "値6" }, ] 値のみの配列 暗黙的に、"Value"というキーが付与される JSON() JSON() JSON() { "列1": "値1", "列2": "値2", "列3": "値3" } コレクションから 変数から
  41. 配列を操作/参照する ▪ コレクションや変数に格納する ➢ 配列 ➢ レコード ClearCollect(col, [ "値1",

    "値2", "値3" ]) 暗黙的に"Value"というカラムが 付与されたテーブル型になる 43 ClearCollect(col, { 列1:"値1", 列2:"値2", 列3:"値3" }, { 列1:"値4", 列2:"値5", 列3:"値6" }) Set(tbl, Table({ 列1:"値1", 列2:"値2", 列3:"値3" }, { 列1:"値4", 列2:"値5", 列3:"値6" })) Set(tbl, [ "値1", "値2", "値3" ]) ClearCollect(col, { 列1:"値1", 列2:"値2", 列3:"値3" }) Set(Rec, { 列1:"値1", 列2:"値2", 列3:"値3" }) ➢ テーブル { "列1": "値1", "列2": "値2", "列3": "値3" } [ { "列1": "値1", "列2": "値2", "列3": "値3" } ] JSON() JSON() Value 値1 値2 値3 列1 列2 列3 値1 値2 値3 名前 値 列1 値1 列2 値2 列3 値3 列1 列2 列3 値1 値2 値3 値4 値5 値6 引数がレコードの場合は、Record型に格納される
  42. 配列を操作/参照する ▪ コレクションのレコードを編集 – Patch(),Update(),UpdateIf() 44 ▪ コレクションのレコードを削除 – Remove(),RemoveIf()

    ▪ コレクションの値を参照 – Filter(),Search() ,LookUp(),Index() ,First() などで、 行(レコード)を特定し、[.列(カラム)]で列を指定 ▪ コレクションにレコードを追加 – Patch() ,Collect() Index(col, 2).列2 Lookup(col, 列1="値1").列2 ForAll() を組み合わせると さらに複雑な操作が可能です Power AppsでもJSONと仲良くなるために https://qiita.com/MiyakeMito/items/ffcc7639b2813dee77ca
  43. ▪ Power Automate から「要求」コネクタ-「応答」 – 複雑なJSONのデータを解析済みで扱える [応答]アクションは プレミアムコネクタです [ {

    "名前": "アメリカ合衆国", "地区": "北アメリカ", "地理": { "首都": "ワシントンD.C.", "面積": 9834000, "人口": 331003000, "主要都市": [ { "名前": "ニューヨーク", "人口": 17799861 }, { "名前": "ロサンゼルス", "人口": 11789487 }, { "名前": "シカゴ", "人口": 8307904 }, { "名前": "ホノルル", "人口": 718182 } ] Power Apps で JSONを解析 45 JSONペイロードを 張り付け Power Apps には ➢ オブジェクト: レコード型 ➢ 配列: テーブル型 で返ります Collect(col, Flow.Run()); Set(rec, Flow.Run()); Set(tbl, Flow.Run());
  44. Power Apps で JSON を解析 ▪ ParseJSON() 関数 – JSON(テキスト)をパースし、目的の値が取得可能

    Text(First(Table(ParseJSON( txtJSON ))).Value.首都) [ { "人口": 331003000, "面積": 9834000, "首都": "ワシントンD.C." } ] ワシントンD.C. 実験段階の機能である 「ParseJSON function and untyped object」 をONする必要があります 46 Text(ParseJSON( txtJSON ).首都) { "人口": 331003000, "面積": 9834000, "首都": "ワシントンD.C." }
  45. ParseJSON() 関数の仕様 Text(First(Table(ParseJSON( txtJSON ))).Value.首都) [ { "人口": 331003000, "面積":

    9834000, "首都": "ワシントンD.C." } ] 47 Text(ParseJSON( txtJSON ).首都) { "人口": 331003000, "面積": 9834000, "首都": "ワシントンD.C." } Inputは文字列です ① 配列はTable()で型指定します ② First(),Index()などで行を指定します ③ ".Value"(カラム)を指定します ④ キーを指定します 型指定されていないオブジェクトを返すので、 型変換関数(Text(),Value(),Table()など)で型を指定します
  46. まとめ

  47. まとめ JSONを制す者は Power Automateを制します (たぶん) JSONと仲良くなれましたか? 49

  48. ありがとう ございました 50