- リンクを取得
- ×
- メール
- 他のアプリ
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
注意点
- 予約キーワードリスト: Apexの予約キーワード(例: `currency`、`class`、`public` など)は、Salesforceの公式ドキュメントを確認してください。
- 例外処理: JSONが不完全または無効な場合に備え、適切なエラーハンドリングを実装することが重要です。
- プロパティ名の一貫性: JSON文字列内のプロパティ名は大文字小文字を区別します。正確なキー名を指定してください。
コメント
コメントを投稿