【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.