tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:RemoteAction / JSON / extendsについて勉強しました

f:id:tyoshikawa1106:20150404144604p:plain

イマイチ理解できていなかったところのあるRemoteAction / JSON / extendsについて勉強しました。

extendsについて

Apexクラスではextendsを宣言することで別のクラスを継承できます。これにより他のクラスでも使用できる処理を共通化することが可能です。

f:id:tyoshikawa1106:20150404145611p:plain


extendsで呼び出すApexクラスはabstractを宣言する必要があります。

f:id:tyoshikawa1106:20150404145555p:plain


今回確認したかったのは、extends内にある処理をRemoteActionで実行できるかどうかです。試してみたところ問題なく実行できました。

f:id:tyoshikawa1106:20150404150112p:plain


共通で使用するRemoteAction処理が多い場合は、extendsで継承させるといいかもしれません。

RemoteActionとJSONについて

RemoteActionを実行するときにセットする引数はsObject型として渡すことができません。そのため、Page側から渡す値が多くなると引数の数が増えて大変になってしまいます。

そんなときは引数をJSON文字列として渡す方法が便利です。これにより1つの引数で複数の情報を渡すことが可能になります。

JavaScript内でJSON文字列を用意する方法

JSON文字列を用意するには、まずJavaScript内でobjectを用意します。次のような感じです。

f:id:tyoshikawa1106:20150404150920p:plain


これでNameとAccountNumberという変数を持ったaccountというobjectを用意できました。次のように値をセットできます。

f:id:tyoshikawa1106:20150404151054p:plain


値のセットが完了したら、JSON.stringify()を使ってJSON文字列に変換します。

f:id:tyoshikawa1106:20150404151322p:plain


Apexクラス内ではString文字列として扱われます。

f:id:tyoshikawa1106:20150404151618p:plain


この時の値は次のようにセットされています。

f:id:tyoshikawa1106:20150404151703p:plain


テストクラス作成時にテストデータとして用意したい場合はこんな感じです。

f:id:tyoshikawa1106:20150404152950p:plain


値の受け渡しが上手くいったところでApexクラス内で使用するために文字列からMapに変換します。変換にはJSON.deserializeUntyped()が便利です。これでobjectの変数名をキーに各値がセットされたmapを取得できます。

f:id:tyoshikawa1106:20150404151948p:plain


Mapから値を取得する方法はこんな感じです。
f:id:tyoshikawa1106:20150404152125p:plain


後は通常通りに処理を実装するだけです。JSON.deserialize()のように値受け取り用のクラスを用意したりする必要も無いのでシンプルなコードになります。


JSON.deserializeUntyped()の使い方はこちらで紹介されていました。


勉強用に作成したサンプルコードです。


RemoteActionはまだまだ活躍する機能だと思うので使い方を覚えておくと便利だと思います。