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 が入ることが許容され、実行時のエラーを回避できます。

さいごに

このあたりは決まりなので覚えておくだけで良いのですが、覚えられないのでメモしておきました。