Jsonでデータを受け取ってレコードを新規作成または更新する機能を実装しました。
項目をベタ打ちではなく、
項目値を動的に取得する方法で実装したので紹介します。
どんな機能を実装したのか 流れ
Jsonでデータを受け取る
Jsonデータをkeyが項目の文字列(String型)で、項目の値と紐づくMapに変換
Mapの値をもとに、レコードを作成または更新する。
実装の中で、Mapの項目値をレコードに設定する処理をメソッド化しました。
実際のコード↓
qiita.apex
private static void insertOrUpdateFromJson(Map<String, Object> jsonData, SSAP_PersonalCriteria__c pc, Boolean isUpdate) {
for (String apiName : jsonData.keySet()) {
// 日付型の場合
if (apiName == 'Date__c') {
pc.put(apiName, Date.valueOf(Date.parse((String)jsonData.get('Date__c'))));
// Boolean型の場合
} else if (jsonData.get(apiName) instanceof Boolean) {
pc.put(apiName, (Boolean) jsonData.get(apiName));
// String型の場合
} else if (jsonData.get(apiName) instanceof String) {
pc.put(apiName, (String) jsonData.get(apiName));
}
}
}
instanceof について
instanceof キーワードは、式中のキーワードの右にある対象の型を、キーワードの左で宣言される型の代替にできるかどうかを調べる場合のみに使用できます。
つまり、右で指定した値を、左の型に変換可能かどうかを見ることができる。
↓ Salesforce開発者リファレンス
↓参考にさせていただいた記事
変数を直接指定することはできない。
Boolean b = true;
System.debug(b instanceof Boolean); // ❌ NG:bはインスタンスではない
Object obj = true;
System.debug(obj instanceof Boolean); // ✅ OK:objはBooleanのインスタンス
- 日付型の変換
日付型は、2025-07-15の形式じゃないと認識してくれなかった。
2025/07/15 の形式だとエラーになった。
↓こちらの記事を参考にして型変換させていただきました
まとめ
動的に設定できると汎用性があるのでいいと思う。
オブジェクトごとに同じようなクラスをたくさん作る必要があるため、これを活用したい。