- リンクを取得
- ×
- メール
- 他のアプリ
- リンクを取得
- ×
- メール
- 他のアプリ
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)**として定義する。
- デシリアライズ時に、適切なクラスを使用する。
コメント
コメントを投稿