【Salesforce】RestAPIでJSONを返す
SalesforceのREST APIを使用して内部クラス等のJSONを返す場合、文字列に変換する必要があるかと思っていました。
ハマるまではいきませんでしたが、少し引っかかったのでメモです。
分割して記述していますが、出力するクラスはREST APIクラスの内部クラスです。
/**
* JSON出力用クラス
*/
global class JsonMaterial{
public Integer intValue;
public String strValue;
public List<Integer> intList;
public List<String> strList;
// コンストラクタで値を設定する
global JsonMaterial(){
intValue = 100;
strValue = '100';
intList = new List<Integer>();
strList = new List<String>();
for(Integer i = 100; i <= 300; i += 100){
intList.add(i);
strList .add(String.valueOf(i));
}
}
}
/**
* 動作確認用REST API
*/
@RestResource(urlMapping='/Experiment/*')
global with sharing class ExperimentRestApi {
@HttpGet
global static String doGet() {
String returnValue = '';
JsonMaterial jsonMaterial;
// 返却するクラスを作成する
jsonMaterial = new JsonMaterial();
// JSONの形式に変換する
returnValue= JSON.serialize(jsonMaterial);
return returnValue;
}
"{\"strValue\":\"100\",\"strList\":[\"100\",\"200\",\"300\"],\"intValue\":100,\"intList\":[100,200,300]}"
/**
* 動作確認用REST API
*/
@RestResource(urlMapping='/Experiment/*')
global with sharing class ExperimentRestApi {
@HttpGet
global static String doGet() {
String returnValue = '';
JsonMaterial jsonMaterial;
// 返却するクラスを作成する
jsonMaterial = new JsonMaterial();
// JSONの形式に変換する
returnValue= JSON.serialize(jsonMaterial);
// URLエンコードを行う
returnValue = EncodingUtil.urlEncode(returnValue, 'UTF-8');
return returnValue;
}
"%7B%22strValue%22%3A%22100%22%2C%22strList%22%3A%5B%22100%22%2C%22200%22%2C%22300%22%5D%2C%22intValue%22%3A100%2C%22intList%22%3A%5B100%2C200%2C300%5D%7D""%7B%22strValue%22%3A%22100%22%2C%22strList%22%3A%5B%22100%22%2C%22200%22%2C%22300%22%5D%2C%22intValue%22%3A100%2C%22intList%22%3A%5B100%2C200%2C300%5D%7D"
/**
* 動作確認用REST API
*/
@RestResource(urlMapping='/Experiment/*')
global with sharing class ExperimentRestApi {
@HttpGet
global static JsonMaterial doGet() {
String returnValue = '';
JsonMaterial jsonMaterial;
// 返却するクラスを作成する
jsonMaterial = new JsonMaterial();
// 変換を行わずに返す
return jsonMaterial;
}
{"strValue":"100","strList":["100","200","300"],"intValue":100,"intList":[100,200,300]}
結果を見て分かるように、変換をせずに返却するのが良いようです。
では、URLでREST APIを使った場合はどうでしょうか。
https://{インスタンス}/services/data/v37.0/query/?q=SELECT ID,NAME FROM ACCOUNT LIMIT 1
{"totalSize":1,"done":true,"records":[{"attributes":{"type":"Account","url":"/services/data/v37.0/sobjects/Account/001d000000KF2K5AAL"},"Id":"001d000000KF2K5AAL","Name":"GenePoint"}]}
ちゃんとJSONで帰ってきましたね。
No comments.