応答本文には、求める必要な情報が含まれています。例えば、HTTP 要求を実行して、Google マップを使って地理座標を取得する場合、結果の座標は応答本文内に返されます。

(XPRIM_HttpRequest オブジェクトの) 応答オブジェクトの read メソッドの 1 つを使ってこの応答本文を読み込むことができます。

ほとんどの Web サービス、特に REST Web サービスは応答を JSON として返します。以前はXML が一般的な形式でしたが、最近は XML の影が薄くなり、XML データを送受信するサービスはほとんど見られなくなりました。


JSON 応答を効率よく読み込むには XPRIM_RandomAccessJsonReader または XPRIM_JsonReader を利用してください。

XPRIM_RandomAccessJsonReader を使って、自身の JSON データのどの部分でも読み込むことが可能です。これは名前またはインデックスで参照できます。

XPRIM_JsonReader は速度が速く、前方向専用のリーダーです。テープ上のデータを読むのと同じ手法で JSON データを読み込みます。

JSON データは順番に読み込まれますので、JSON データの異なる領域に直接アクセスすることはできません。(データベース・サービスから戻されたデータなどの) 大きな JSON データを読み込む場合、XPRIM_JsonReader を利用するようにしてください。

(XPRIM_RandomAccessJsonReader が使用するメモリ量は JSON データのサイズに相関することに対して) これはメモリ使用量が非常に少ないです。

多くの場合、 XPRIM_JsonReader に対して XPRIM_RandomAccessJsonReader を選択するのが、使いやすいでしょう。JSON データが非常に大きい場合を除き、常に XPRIM_RandomAccessJsonReader を利用するようにしてください。


例 - 応答本文を JSON として読み込む Google マップのジオコーディング要求を実行すると、次のような応答を受け取ります。

{
   "results" :
   [
      {
         "formatted_address" :"1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
         "geometry" :
         {
            "location" :
            {
               "lat" :37.4224764,
               "lng" :-122.0842499
            }
        }
    ]
}


ここで注目するのは、latlong の値です。これは、 results (element 1) >> geometry >> location 経由でアクセスできます。

Define_Com Class(#XPRIM_HttpRequest) Name(#Req)
Define_Com Class(#XPRIM_RandomAccessJsonReader) Name(#Reader)
...
#Req.DoGet Url('https://maps.googleapis.com/maps/api/geocode/json?...')

 * 要求が正しく実行されたか確認
If (#Req.Response.IsSuccessHttpStatusCode)
     * 応答のJSON リーダー・ソースを HTTP 要求から設定
    #Reader.SetSourceHttpResponse HttpResponse(#Req.Response)
     *  ('lat' と 'lng' 値が含まれている) 'location' オブジェクトにナビゲート
     * ナビゲーション・パスを指定して、'location' エレメントへナビゲート
     * パスの名前とインデックスはスラッシュで区切る
    #Reader.BeginObjectWithPath Path('results/1/geometry/location')
     * 緯度と経度の値を取得
    #Latitude := #Reader.ReadNumberWithName('lat')
    #Longitude := #Reader.ReadNumberWithName('lng')
     * "BeginObject" を "EndObject" で終了
    #Reader.EndObject
Endif


次は: 無効な応答を確認