【Salesforce】RestAPIでJSONを返す

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です