PowerAutomateでフローからファイル入出力するときの形式として、SharePointリストやExcelファイルよりもJSONファイルに優位性があることがあります。
これは例えばフローAのある処理の結果を利用してフローBが別のある処理を実行するような場合です。
JSONファイルの優位性は:
- 読み書きが高速
- 書き込み中の「中途半端な状態」で参照されるリスクがない
- 日時データの表現(シリアル vs. ISO8601)に関する難しさがない
- 日時データのタイムゾーンに関する難しさがない
- 配列でもマップでも取り扱える
- レコードを構成するデータをカラム(列)毎にアクションの入力欄に設定する面倒がない
──といったところ。
Problem
ところで、JSONファイルの内容を読み取るために「ファイル コンテンツの取得」ないし「パスによるファイル コンテンツの取得」アクションを使用していると、次のようなエラーが発生してしまうことがあります:
InternalServerError. 内部サーバー エラーが発生しました。追跡 ID は、'3f1bf9e6-6b4b-4fc5-bceb-625ad746183a' です。
Solution
「内部サーバーエラー」では原因がまったくわからないわけですが、私が遭遇した事例ではあれこれ試した結果、以下の条件(AND)が満たされた場合にエラーとなることがわかりました:
- JSONのルート・レベルが配列(
[...]
) - アクションの「コンテンツタイプの推論」が「はい」(
true
)
ルート・レベルをオブジェクト({"foo": [...]}
)にするか、「コンテンツタイプの推論」を「いいえ」(false
)にすると、このエラーは発生しなくなります。
「コンテンツタイプの推論」を「いいえ」(false
)にすると当然拡張子によるコンテンツタイプの推論が行われなくなるので、アクションの出力形式は「JSON形式のデータを内容とする文字列」となります("[...]"
)。
このためフローの後続アクションでオブジェクトとして利用する場合は、json(...)
関数でデシリアライズを行う必要があります。