ApexのJSON処理で発生する「リスト形式のデータエラー」の解決法

Salesforce ApexでJSONデシリアライズ時のリストエラーを修正する方法

はじめに

SalesforceのApexコードで外部APIからJSONデータを取得し、デシリアライズする際に**「リスト形式のデータを正しく処理できない」**という問題が発生することがあります。
特に、**「単一オブジェクトとして処理しようとしたが、実際はリストだった」**というケースが多く見られます。

本記事では、この問題の原因と正しいデシリアライズ方法を解説します。


問題の発生原因

ApexでJSONデータを処理する際、取得するデータの構造とApexクラスの構造が一致していないと、適切にデシリアライズできません。

誤ったコードの例:

public class Equifax {
    public class Empresa {
        public String name;
        public String id;
    }
}

このコードでは、JSONレスポンスが**リスト(配列)**として返ってきた場合、Apex側で単一のオブジェクトとして処理しようとしてしまい、エラーが発生します。


正しいApexクラスの定義

外部APIのJSONデータの例(リスト形式):

{
    "empresa": [
        {
            "name": "ABC Corp",
            "id": "12345"
        }
    ]
}

このデータに対応するApexクラスを正しく定義するには、「リスト(List)」を用いたデータ構造にする必要があります。

修正後のApexコード

public class Equifax {
    public List<Empresa> empresa;

    public class Empresa {
        public String name;
        public String id;
    }
}

Apexでのデシリアライズ方法

次に、JSON.deserialize() を使用して、正しくデシリアライズする方法を見ていきます。

修正前(誤ったデシリアライズ方法):

Equifax.Empresa empresita = (Equifax.Empresa)JSON.deserialize(jsonString, Equifax.Empresa.class);

このコードでは、Equifax.Empresa を単一オブジェクトとして扱っていますが、JSONの構造がリストのため、デシリアライズ時にエラーになります。

修正後(正しいデシリアライズ方法):

Equifax empresita = (Equifax)JSON.deserialize(jsonString, Equifax.class);

この修正により、empresa フィールドは List になり、以下のようにデータへアクセスできます:

System.debug(empresita.empresa[0].name);  // "ABC Corp"
System.debug(empresita.empresa[0].id);    // "12345"

まとめ

発生した問題

  • JSONレスポンスがリスト形式だったが、Apex側で単一オブジェクトとして処理しようとしてエラーが発生した。

解決策

  • JSONの構造に合わせて、Apexクラスを**リスト(List)**として定義する。
  • デシリアライズ時に、適切なクラスを使用する。

コメント