JSONデータを扱う際、特定階層のキーのみを取得したいケースは少なくありません。本記事では、Power Automateを使ってJSONデータからキーを簡単に抽出する方法を紹介します。全角文字や記号を含むキーでも問題なく抽出できる手法です。
大まかな流れ
- キーを取り出したい階層のCSVテーブルの作成
-
split
関数とdecodeUriComponent
関数で、改行コードを元にデータを行ごとに分割 - 2の出力の一番最初の要素を、
split
関数を使ってカンマ区切りで取り出す
具体的な手順
今回は以下のJSONを使ってキーだけを抽出していきます。
{
"名": "太郎",
"姓": "山田",
"性別": "男",
"都道府県": "東京都",
"市区町村": "千代田区",
"番地以下・建物名": "千代田3-1-1"
}
1. キーを取り出したい階層のCSVテーブルの作成
「CSVテーブルの作成」アクションを使用して、キーを取り出したい階層をCSV形式に変換します。
このアクションにより、キーが1行目、値が2行目に格納されたCSVテーブルが生成されます。
取り出したい階層が配列になっていない場合は、変換したいオブジェクト型をarray
関数で配列に変換してからコネクタの処理を行いましょう。
2. 改行コードを元に行で分割
「作成」アクションを追加し、入力に以下の式を設定します:
split(body('CSV_テーブルの作成'), decodeUriComponent('%0D%0A'))
ここでのポイント
-
decodeUriComponent('%0D%0A')
は改行コード\r\n
のURLエンコード表現です - この改行コードを区切り文字として
split
関数で分割しています
この処理により、CSVテーブルが以下の構造の配列に変換されます。
- 1要素目:キーの羅列(カンマ区切り)
- 2要素目:値の羅列(カンマ区切り)
3. キー一覧の抽出
続いて、もう一つ「作成」アクションを追加し、valueに以下の式を設定します:
split(first(outputs('作成_-_CSVの全行')), ',')
このステップでは:
- 手順2で作成した配列の最初の要素(キーの羅列が格納された文字列)を
first
関数で取得 - それをカンマで区切り(
split
)、各キーが独立して格納された配列を生成
これで、各JSONキーを個別に格納した配列が完成しました。
[
"名",
"姓",
"性別",
"都道府県",
"市区町村",
"番地以下・建物名"
]
配列なのでfor each
などのループアクションで簡単に処理できます。
[補足]うまくいかなかった方法
他の方の記事で紹介されていたXMLを活用する方法も試しましたが、いくつかの問題がありました。
xml
関数でJSONデータをXML形式に変換する際、全角記号が含まれていると自動的にUnicodeエスケープシーケンスに置き換えられてしまいます。
{
"番地以下・建物名": "千代田3-1-1"
}
<番地以下_x30FB_建物名>
千代田3-1-1
</番地以下_x30FB_建物名>
// JSONに戻しても...
{
"key": "番地以下_x30FB_建物名"
}
何もしなければ
これだけならreplace
関数で個別に置換処理すればいいと思うでしょう。
しかし、Microsoft Formsのアンケート結果が集約されるExcelシートではどうでしょう。
{
"飲食店を選ぶ際に「最も重視する点」は何ですか?(例:価格・味・雰囲気など)": "価格"
}
<飲食店を選ぶ際に_x300C_最も重視する点_x300D_は何ですか_xFF1F__xFF08_例_xFF1A_価格_x30FB_味_x30FB_雰囲気など_xFF09_>
価格
</飲食店を選ぶ際に_x300C_最も重視する点_x300D_は何ですか_xFF1F__xFF08_例_xFF1A_価格_x30FB_味_x30FB_雰囲気など_xFF09_>
中点(・)や括弧などの記号を含むキーを扱うケースは多いと思います。私の場合、後の例のように複数種類の記号が含まれていたため、XML変換方式は断念しました。
まとめ
JSONのキーを扱いたいとき(特に全角記号を含むとき)には、一度CSVテーブル化すると文字を損なわずに取り出せます。
Power AutomateのクラウドフローだとCSVは扱いにくいのであまり使われていない印象ですが、こういった場面で思わぬ活躍するのは面白いですね。