お知らせ

Delphi: JSONから必要なデータを取得する

Delphi

 DelphiでJSONの第2階層からデータを取得する方法を紹介します。

TJSONValue、TJSONObject

TJSONValue、TJSONObjectの利用方を紹介します。
使用例を示した方がわかりやすいと思いますので、エンバカロのホームページでも紹介されているExchangeRates APIで取得したJSONからデータを取得するプログラムを示します。

ExchangeRates APIで取得したJSONデータ

このAPIは、為替レートの取得に使うことができます。
JSONに含まれる為替レートはユーロが基底になっているため、円ドルレートを取得するためには、円ユーロとドルユーロのレートを取得する必要があります。これらの値はJSONの第二階層に存在します。
JSONの実際の中身はこちらのページで示しています。

プログラム例

APIで取得した情報をTJSONValueオブジェクトに代入した後のプログラムを示します。
TJSONValueオブジェクトに代入するまでの前半部分はこちらにあります。

  JSONObject := jValue as TJSONObject;  // TJSONValueからTJSONObjectに変換
  jV := JSONObject.GetValue('rates');  // 'rates'という名の第二階層をTJSONValueオブジェクトに代入  
  JSONObject := jV as TJSONObject;
  LJPY :=  JSONObject.GetValue<Double>('JPY');  // 'JPY'の値をDouble型として取得
  LUSD :=  JSONObject.GetValue<Double>('USD');  // 'USD'の値をDouble型として取得
  LYPD:= LJPY / LUSD; // 円/ドルレートを計算

JSON第二階層部分の取得

TJSONObjectのGetValueで指定された名前の第二階層をTJSONValueオブジェクトに代入します。
さらにデータを取り出すためにTJSONValueからTJSONObjectへの変換を行います。

名前と型式を指定してJSONデータを取得

LJPY := JSONObject.GetValue<Double>(‘JPY’);
のように名前と型式を指定してデータを取得することができます。

実用の例

楽天証券から送られてくる米国株の配当入金のお知らせメールをスプシに貼り付けられる形式に整形するプログラムを示します。

米国株の配当入金メールをスプシに貼り付けるための整形

//楽天証券の配当メール(米国)の解析
procedure TForm1.Button7Click(Sender: TObject);
var
  jValue, jV: TJSONValue;
  JSONObject: TJSONObject;
  LJPY, LUSD, LYPD, DYen: Double;
  i,m, IYen: Integer;
  St1, St2, LOutput: String;
  SL: TStringList;
begin
//オブジェクトインスペクタで設定しない場合は以下のコメントアウトを解除する
  //RESTClient1.BaseURL := 'http://api.exchangeratesapi.io/v1';
  //RESTClient1.AddParameter('EndPoint','latest',TRESTRequestParameterKind.pkGETorPOST);
  //RESTClient1.AddParameter('access_key', '5accc574727d0bc8007b881234567890',TRESTRequestParameterKind.pkGETorPOST);
  //RESTRequest1.Resource := 'latest';
  //RESTRequest1.Method := TRESTRequestMethod.rmGET;
  //RESTRequest1.Response := RESTResponse1;
  //RESTRequest1.Response.ContentType := 'application/json';
  //RESTRequest1.Response.ContentEncoding := 'UTF-8';

  RESTRequest1.Execute;   //   ExchangeRates API の実行

  jValue := RESTResponse1.JSONValue;  // 取得情報をTJSONValueオブジェクトに代入  

  Memo1.Lines.Add(jValue.ToString); //取得したJsonを文字列にして表示

  JSONObject := jValue as TJSONObject;  // TJSONValueからTJSONObjectに変換
  jV := JSONObject.GetValue('rates');  // 'rates'という名の第二階層をTJSONValueオブジェクトに代入  
  JSONObject := jV as TJSONObject;
  LJPY :=  JSONObject.GetValue<Double>('JPY');  // 'JPY'の値をDouble型として取得
  LUSD :=  JSONObject.GetValue<Double>('USD');  // 'USD'の値をDouble型として取得
  LYPD:= LJPY / LUSD; // 円/ドルレートを計算

// ExchangeRates API の使用には回数制限があるので以下のプログラムを試すときは
//ここより上をすべてコメントアウトして適当な円/ドルレートを設定するとよい。

  //LYPD:= 157.24;   // 円/ドルレートの設定例

// 配当金メールを家計簿フォーマットに変換

  SL:= TStringList.Create;

  for I := 0 to Memo1.Lines.Count -1 do
  begin
    St1:= Memo1.Lines[i];
    St2:= St1;
    St1:= AnsiLeftStr(St1,3);
    if St1 = '銘柄名' then
    begin
      LOutput:= DateToStr(Now) + #9 + '配当' + #9;
      Delete(St2,1,10);
      LOutput:= LOutput + St2 + #9 + #9;

    end;
    if St1 = '入金額' then
    begin
      m:= Length(St2);
      Delete(St2,1,10);
      St2:= AnsiLeftStr(St2,m-14);  //   入金額(ドル)の取得
      DYen:= StrToFloat(St2) * LYPD;  // ドルを円に換算
      IYen := Round(DYen);  // 小数点以下を四捨五入、切り捨ての場合はTrunc()
      LYPD := Round(LYPD*10)/10;  // 円/ドルレートを小数点第二位で四捨五入
      LOutput:= LOutput + '-' + IntToStr(IYen) + #9 + FloatToStr(LYPD);
      SL.Add(LOutput);
      LOutput:= '';
    end;

  end;
  Memo1.seltext:= SL.Text;
  Clipboard.AsText := SL.Text;
  SL.Free;

end;

整形前の文字列(メールの内容)

■配当情報

銘柄名      :IBM
コード/ティッカー:IBM
入金額      :10.79USドル
受取方法     :外貨
入金先      :証券口座の外貨預り金(USドル)

銘柄名      :マラソン・オイル
コード/ティッカー:MRO
入金額      :3.17USドル
受取方法     :外貨
入金先      :証券口座の外貨預り金(USドル)

スプシ貼付結果

配当生活は遠い・・・

タイトルとURLをコピーしました