SalesforceにおけるWebサービスコールアウトのテスト完全ガイド

Apexにおける予約キーワードプロパティを持つJSONの処理ガイド


Apexで予約キーワードのJSONプロパティをデシリアライズする方法

問題の背景

次のようなJSON文字列をApexオブジェクトにデシリアライズしようとする場合、プロパティ名がApexの予約キーワード(例: `currency`、`class`)であるとエラーが発生します。

例:
String jsonString = '{"currency" : "ABC"}';

// JSONをMapに変換
Map<String, Object> jsonMap = (Map<String, Object>) JSON.deserializeUntyped(jsonString);

// 予約キーワードのプロパティにアクセス
String currencyValue = (String) jsonMap.get('currency');

// デバッグ出力
System.debug('Currency: ' + currencyValue);  // 結果: Currency: ABC

このコードは、`currency` が予約キーワードとして扱われるため、エラーが発生して実行できません。


解決方法

ApexでJSONプロパティに予約キーワードを含む場合、以下のいずれかのアプローチで対応できます。


方法 1: `JSON.deserializeUntyped` を使用

`JSON.deserializeUntyped` を使うことで、JSONを `Map<String, Object>` として扱い、予約キーワードのプロパティにも文字列キーでアクセスできます。

例:
String jsonString = '{"currency" : "ABC"}';

// JSONをMapに変換
Map<String, Object> jsonMap = (Map<String, Object>) JSON.deserializeUntyped(jsonString);

// 予約キーワードのプロパティにアクセス
String currencyValue = (String) jsonMap.get('currency');

// デバッグ出力
System.debug('Currency: ' + currencyValue);  // 結果: Currency: ABC

この方法では、予約キーワードをそのまま使用でき、追加の変換を行わずに値を取得できます。


方法 2: ラッパークラスでプロパティ名を変更

予約キーワードをプロパティ名として直接使用できないため、ラッパークラスで代替の名前を使用します。

例:
public class JSONResult {
    public String myCurrency;  // "currency" に対応
}

String jsonString = '{"currency" : "ABC"}';

// JSONをMapに変換して値を取得
Map<String, Object> jsonMap = (Map<String, Object>) JSON.deserializeUntyped(jsonString);

// ラッパークラスに値を割り当て
JSONResult res = new JSONResult();
res.myCurrency = (String) jsonMap.get('currency');

// デバッグ出力
System.debug('Currency: ' + res.myCurrency);  // 結果: Currency: ABC

方法 3: JSON文字列をプリプロセス

デシリアライズ前に、予約キーワードのプロパティ名を別の名前に置換します。

例:
String jsonString = '{"currency" : "ABC"}';

// JSON文字列を置換
String modifiedJson = jsonString.replace('"currency"', '"myCurrency"');

// 修正後のJSONをラッパークラスにデシリアライズ
JSONResult res = (JSONResult) JSON.deserialize(modifiedJson, JSONResult.class);

// デバッグ出力
System.debug('Currency: ' + res.myCurrency);  // 結果: Currency: ABC

注意点

  1. 予約キーワードリスト: Apexの予約キーワード(例: `currency`、`class`、`public` など)は、Salesforceの公式ドキュメントを確認してください。
  2. 例外処理: JSONが不完全または無効な場合に備え、適切なエラーハンドリングを実装することが重要です。
  3. プロパティ名の一貫性: JSON文字列内のプロパティ名は大文字小文字を区別します。正確なキー名を指定してください。

コメント