この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

JSON の解析

JSONParser クラスのメソッドを使用して、JSON で符号化されたコンテンツを解析できます。

JSONParser メソッドを使用して、Web サービスコールアウトの JSON 符号化方式の応答など、外部サービスへのコールから返される JSON 形式の応答を解析します。次のサンプルでは、JSON 文字列を解析する方法を示します。

サンプル: Web サービスコールアウトからの JSON 応答の解析

次の例は、JSONParser メソッドを使用して JSON 形式の応答を解析する方法を示します。この例では、JSON 形式の応答を返す Web サービスへのコールアウトを作成します。次に、応答を解析して、すべての totalPrice 項目値を取得し、価格の総計を計算します。このサンプルを実行するには、Salesforce ユーザインターフェースで Web サービスエンドポイント URL を認証済みリモートサイトとして追加する必要があります。そのためには、Salesforce にログインし、[設定] から [セキュリティのコントロール] | [リモートサイトの設定] をクリックします。
1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class JSONParserUtil {
18    @future(callout=true)
19    public static void parseJSONResponse() {        
20        Http httpProtocol = new Http();
21        // Create HTTP request to send.
22        HttpRequest request = new HttpRequest();
23        // Set the endpoint URL.
24        String endpoint = 'https://docsample.herokuapp.com/jsonSample';
25        request.setEndPoint(endpoint);
26        // Set the HTTP verb to GET.
27        request.setMethod('GET');
28        // Send the HTTP request and get the response.
29        // The response is in JSON format.
30        HttpResponse response = httpProtocol.send(request);
31        System.debug(response.getBody());
32        /* The JSON response returned is the following:
33        String s = '{"invoiceList":[' +
34        '{"totalPrice":5.5,"statementDate":"2011-10-04T16:58:54.858Z","lineItems":[' +
35            '{"UnitPrice":1.0,"Quantity":5.0,"ProductName":"Pencil"},' +
36            '{"UnitPrice":0.5,"Quantity":1.0,"ProductName":"Eraser"}],' +
37                '"invoiceNumber":1},' +
38        '{"totalPrice":11.5,"statementDate":"2011-10-04T16:58:54.858Z","lineItems":[' +
39            '{"UnitPrice":6.0,"Quantity":1.0,"ProductName":"Notebook"},' +
40            '{"UnitPrice":2.5,"Quantity":1.0,"ProductName":"Ruler"},' +
41            '{"UnitPrice":1.5,"Quantity":2.0,"ProductName":"Pen"}],"invoiceNumber":2}' +
42        ']}'; 
43        */
44
45        // Parse JSON response to get all the totalPrice field values.
46        JSONParser parser = JSON.createParser(response.getBody());
47        Double grandTotal = 0.0;
48        while (parser.nextToken() != null) {
49            if ((parser.getCurrentToken() == JSONToken.FIELD_NAME) && 
50                (parser.getText() == 'totalPrice')) {
51                // Get the value.
52                parser.nextToken();
53                // Compute the grand total price for all invoices.
54                grandTotal += parser.getDoubleValue();
55            }
56        }
57        system.debug('Grand total=' + grandTotal);
58    }   
59}

サンプル: JSON 文字列の解析とオブジェクトへの並列化

この例では、ハードコードされた JSON 文字列を使用します。これは、前の例のコールアウトで返された JSON 文字列と同じです。この例では、文字列全体が readValueAs メソッドを使用して Invoice オブジェクトに解析されます。また、skipChildren メソッドを使用して子配列と子オブジェクトをスキップし、リストに含まれる次の同階層の請求書を解析できるようにします。解析されたオブジェクトは、内部クラスとして定義されている Invoice クラスのインスタンスです。各請求書には品目が含まれるため、対応する品目型を表すクラスである LineItem クラスも内部クラスとして定義されます。このサンプルコードをクラスに追加して使用します。
1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public static void parseJSONString() {
18    String jsonStr = 
19        '{"invoiceList":[' +
20        '{"totalPrice":5.5,"statementDate":"2011-10-04T16:58:54.858Z","lineItems":[' +
21            '{"UnitPrice":1.0,"Quantity":5.0,"ProductName":"Pencil"},' +
22            '{"UnitPrice":0.5,"Quantity":1.0,"ProductName":"Eraser"}],' +
23                '"invoiceNumber":1},' +
24        '{"totalPrice":11.5,"statementDate":"2011-10-04T16:58:54.858Z","lineItems":[' +
25            '{"UnitPrice":6.0,"Quantity":1.0,"ProductName":"Notebook"},' +
26            '{"UnitPrice":2.5,"Quantity":1.0,"ProductName":"Ruler"},' +
27            '{"UnitPrice":1.5,"Quantity":2.0,"ProductName":"Pen"}],"invoiceNumber":2}' +
28        ']}';
29
30    // Parse entire JSON response.
31    JSONParser parser = JSON.createParser(jsonStr);
32    while (parser.nextToken() != null) {
33        // Start at the array of invoices.
34        if (parser.getCurrentToken() == JSONToken.START_ARRAY) {
35            while (parser.nextToken() != null) {
36                // Advance to the start object marker to
37                //  find next invoice statement object.
38                if (parser.getCurrentToken() == JSONToken.START_OBJECT) {
39                    // Read entire invoice object, including its array of line items.
40                    Invoice inv = (Invoice)parser.readValueAs(Invoice.class);
41                    system.debug('Invoice number: ' + inv.invoiceNumber);
42                    system.debug('Size of list items: ' + inv.lineItems.size());
43                    // For debugging purposes, serialize again to verify what was parsed.
44                    String s = JSON.serialize(inv);
45                    system.debug('Serialized invoice: ' + s);
46
47                    // Skip the child start array and start object markers.
48                    parser.skipChildren();
49                }
50            }
51        }
52    }
53} 
54
55// Inner classes used for serialization by readValuesAs(). 
56
57public class Invoice {
58    public Double totalPrice;
59    public DateTime statementDate;
60    public Long invoiceNumber;
61    List<LineItem> lineItems;
62    
63    public Invoice(Double price, DateTime dt, Long invNumber, List<LineItem> liList) {
64        totalPrice = price;
65        statementDate = dt;
66        invoiceNumber = invNumber;
67        lineItems = liList.clone();
68    }
69}  
70
71public class LineItem {
72    public Double unitPrice;
73    public Double quantity;
74    public String productName;
75}