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

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

はじめに

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

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


問題の発生原因

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

誤ったコードの例:

  1. public class Equifax {
  2. public class Empresa {
  3. public String name;
  4. public String id;
  5. }
  6. }

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


正しいApexクラスの定義

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

  1. {
  2. "empresa": [
  3. {
  4. "name": "ABC Corp",
  5. "id": "12345"
  6. }
  7. ]
  8. }

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

修正後のApexコード

  1. public class Equifax {
  2. public List<Empresa> empresa;
  3.  
  4. public class Empresa {
  5. public String name;
  6. public String id;
  7. }
  8. }

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

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

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

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

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

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

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

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

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

まとめ

発生した問題

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

解決策

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

コメント