Power Automate から HTTP のアクションで API を呼び出したりすると、その応答データを処理するのに利用することが多いのが「JSON の解析」ですよね。
しかしこの JSON の解析、対象となる JSON の形式に揺れがあると実行時にエラーになってしまう厄介ものです。
よくあるエラーと、その回避方法を書き留めておきます。いつも忘れちゃうので。
JSON の解析をセットアップ
まずは、JSON の解析を設定していきましょう。今回は、次のような JSON を解析してみます。
[ { "firstName": "Hirofumi", "lastName": "Ota", "age": 16 }, { "firstName": "Taro", "lastName": "Yamada", "age": 89 } ]
この JSON を元に「JSON の解析」で [サンプルから生成] したスキーマーが次のようになります。
{ "type": "array", "items": { "type": "object", "properties": { "firstName": { "type": "string" }, "lastName": { "type": "string" }, "age": { "type": "integer" } }, "required": [ "firstName", "lastName", "age" ] } }
それではこれから、よくあるエラーを見ていきましょう。
項目が存在しないパターン
値が存在しない場合、項目ごと削除したデータになっていることがあります。たとえば、次のような形です。
[ { "firstName": "Hirofumi", "lastName": "Ota", "age": 16 }, { "firstName": "Taro", "lastName": "Yamada" } ]
この例では、Yamada Taro さんのデータに age の項目が存在しません。このとき、JSON の解析アクションは次のようなエラーになります。
エラーメッセージには「”Required properties are missing from object: age.”」とあるので、「必須プロパティの age が存在しないよ」という意味ですね。これを回避するためには、JSON の解析のスキーマーを次のように書き換えます。
{ "type": "array", "items": { "type": "object", "properties": { "firstName": { "type": "string" }, "lastName": { "type": "string" }, "age": { "type": "integer" } }, "required": [ "firstName", "lastName" ] } }
ポイントは、元々 19 行目で指定されていた age の必須(required)プロパティの指定を削除した点です。これで age が存在しないデータが許容され、実行時のエラーを回避できます。
値に Null が入るパターン
値が存在しない場合、項目を残したまま値が null になっていることがあります。たとえば、次のような形です。
[ { "firstName": "Hirofumi", "lastName": "Ota", "age": 16 }, { "firstName": "Taro", "lastName": "Yamada", "age": null } ]
この例では、Yamada Taro さんのデータで age が null になっています。このとき、JSON の解析アクションは次のようなエラーになります。
エラーメッセージには「”Invalid type. Expected Integer but got Null.”」とあるので、「数値を期待してたけど、Null だったよ」という意味ですね。また、エラーにある schemaId
などを見ると、どうやら age
のデータに起因してそうなことがわかります。これを回避するには、スキーマーを次のように書き換えます。
{ "type": "array", "items": { "type": "object", "properties": { "firstName": { "type": "string" }, "lastName": { "type": "string" }, "age": { "type": [ "integer", "null" ] } }, "required": [ "firstName", "lastName", "age" ] } }
ポイントは書き換え後の 13 行目から 16 行目です。元々は "type": "integer"
であったものを "type": ["integer","null"]
に書き換えています。これで age に null が入ることが許容され、実行時のエラーを回避できます。
さいごに
このあたりは決まりなので覚えておくだけで良いのですが、覚えられないのでメモしておきました。