Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi/400】Delphi/400 12 Athensの新機能③(JSONバインディングウィザード)

株式会社ミガロ.では、2025年10月に、
Delphi/400の最新バージョンとなる『12 Athens』をリリースいたしました。

Delphi/400 12 Athens リリース(Migaro. ニュース)

本Tipsでは、Delphi/400 12 Athensの新機能や新しい開発手法について
4回に分けてご紹介いたします。
第3回の今回は、新たにJSONデータのマッピングを自動化することができる
『JSONデータバインディングウィザード』機能を紹介します。

これを使うと、Web APIやJSONファイルを指定するだけで、
データ構造に対応したDelphiクラスを自動生成することが可能です。

 

天気予報サンプル作成

事前準備

今回は例として、非商用なら登録不要・無料で利用できる
「Open-Meteo API」を使って天気予報データのJSONを取得し、
それをマッピングしてDelphiで作成したアプリケーション上に表示する手順を紹介していきます。

最初にOpen-MeteoのWeb APIドキュメント(https://open-meteo.com/en/docs)を
参照しながら、リクエストとなるURLを作成します。
URLが正しければ、ブラウザのアドレスバーに貼り付けて実行するだけで結果のJSONが取得できます。
(ドキュメント内でAPIのURLが生成可能です。)

  • ※URLのパラメータ書式
    ①②③④の順に記述、詳細はAPIドキュメント参照)
    • ① https://api.open-meteo.com/v1/forecast
      ⇒ 固定値
    • ② ?latitude=34.6651&longitude=135.4957
      ⇒ 対象地点の緯度と経度(北緯と東経、南緯や西経の場合はマイナスで指定)
    • ③ &daily=temperature_2m_max,……,weathercode
      ⇒ daily=1日ごと、hourly=1時間ごと、minutely_15=15分ごとの天気
      ⇒ 以降は取得したいフィールドのIDをカンマ区切りで指定
       (フィールドIDは、daily・hourly・minutely_15でそれぞれ異なる)
    • ④ &timezone=Asia/Tokyo&past_days=10&forecast_days=16
      ⇒ timezone=タイムゾーン
      ⇒ past_days=(省略可)過去何日分の天気予報を取得するか(省略時は0日、最大93日)
      ⇒ forecast_days=(省略可)今後何日分の天気予報を取得するか(省略時は7日、最大16日)

 

Delphiプロジェクトの作成

ここからはDelphi 12 Athensの操作手順となります。
(Delphi 13 Florenceでも操作手順は同様です。)

まず、プロジェクト作成後に新規作成メニューから
「Web」フォルダ内の「JSONデータバインディング」を選択します。

 
続く画面で、JSONの直接入力、外部ファイルの読み込み、
あるいはRESTサービスからの取得を指定する画面が表示されるので、
今回はRESTサービスから取得(下図では右下)を選択します。
エンドポイントにOpen-Meteo APIでリクエストに使用するURL(先程作成したもの)を入力します。

 
次に、バインディングに関するオプションを設定し、
最終画面においてクラス名を指定します。

 
完了を押すと、対応するDelphiクラスを含むユニットが自動生成されます。

 

生成されたクラスは、キー名と型情報のみを保持し、実際の値は含まれていません。
値の読み込みにはuses節にREST.Jsonを追加し、
TJson.JsonToObjectメソッドを用いて文字列形式のJSONをクラスに転送します。(コーディングは後述)

 

JSON取得ロジックの作成

ロジックでJsonToObjectを行うためにはJSON文字列を用意する必要があります。
今回はDelphiのIDEに付属している「RESTデバッガ」を使用して、
Open-MeteoのWeb APIに接続し取得していきます。

まずDelphiのIDEの「ツール」メニューから「REST デバッガ」を選択すると、
以下のような画面が表示されます。

 
要求(Request)のURLに、先ほど「事前準備」で作成したURLを入力して送信すると、
下図のように応答(Response)のJSONが取得できます。
(RESTデバッガは本来複雑なパラメータを使用したRequestやResponseの調整が可能ですが、
 今回は単純に結果のJSONだけを取得する目的で使用します。)

 
この状態で画面右側の「コンポーネントのコピー」ボタンを押すと、
RequestやResponseの設定を保持したRESTの各コンポーネント情報がクリップボードにコピーされます。
(TRESTClient・TRESTRequest・TRESTResponse・TRESTResponseDataSetAdapter・TFDMemTable)
これらはそのまま対象の設計画面にペーストできます。

その後、ペーストされた各コンポーネントの位置を調整し、
さらに処理で使用するTButton・TStringGridを画面に配置します。

次に「天気取得」ボタンを押下した際のロジックを以下のように記述します。
処理の流れは以下のようになります。

  1. RESTRequest1.Execute; でRequestを送信する。
  2. RESTResponse1.JSONText でResponseのJSON文字列を取得する。
  3. JsonToObjectで、取得したJSON文字列を
    そのままウィザードで生成したクラス(今回の例ではTWeather25)に渡す。
  4. 各要素が分解され、配列に保持される。
  5. 各配列の値を画面のTStringGridに転送していく。
// Open-Meteo APIからJSONを読み込む
procedure TForm1.Button1Click(Sender: TObject);
var
  W25: TWeather25; // ※TWeather25=JSONバインディングウィザードで生成した型
  sJSON: String;
  i: Integer;
begin
  // RESTのリクエスト送信
  FDMemTable1.Close;
  FDMemTable1.Open;
  RESTRequest1.Execute;

  W25 := TWeather25.Create;
  try
    // JSONファイルから取り込むロジック
    sJSON := RESTResponse1.JSONText;
    W25   := TJson.JsonToObject<TWeather25>(sJSON);

    // Gridの書式設定
    StringGrid1.RowCount := 5;
    StringGrid1.ColCount := Length(W25.daily.time) + 1;
    StringGrid1.cells[0, 0] := '日付';
    StringGrid1.cells[0, 1] := '最高気温';
    StringGrid1.cells[0, 2] := '最低気温';
    StringGrid1.cells[0, 3] := '降水確率';
    StringGrid1.cells[0, 4] := '天気';

    // JSONの内容を整理して画面に出力
    for i := 0 to Length(W25.daily.time) - 1 do
    begin                          // ↓これらの配列もウィザードで生成されたもの
      StringGrid1.cells[i+1, 0] := W25.daily.time[i];               // 日付
      StringGrid1.cells[i+1, 1] := W25.daily.temperature_2m_max[i]; // 最高気温
      StringGrid1.cells[i+1, 2] := W25.daily.temperature_2m_min[i]; // 最低気温
      StringGrid1.cells[i+1, 3] := W25.daily.precipitation_probability_mean[i] + '%';
      StringGrid1.cells[i+1, 4] :=     // ↑降水確率                // ↓天気
                   WeatherCodeToStr(StrToIntDef(W25.daily.weathercode[i], -1));
    end;             // ↑weathercodeは整数に変換し、天気の文字列に変換する(後述)

  finally
    FreeAndNil(W25);
  end;
end;

 

今回のOpen-MeteoのWeb APIでは
「最高気温」「最低気温」「平均降水確率」「天気コード」を取得しています。
天気コードは整数値になっているため、
以下のロジックを作成して対応する天気を表す日本語に変換します。

// 天気コードから文字列への変換
function TForm1.WeatherCodeToStr(ACODE: Integer): String;
begin
  case ACODE of
    0 :  Result := '快晴';         // Clear sky
    1 :  Result := '晴れ';         // Mainly clear
    2 :  Result := '時々曇り';     // partly cloudy
    3 :  Result := '曇り';         // overcast
    45:  Result := '霧';           // Fog
    48:  Result := '着氷性の霧';   // depositing rime fog
    51:  Result := '弱い霧雨';     // Light Drizzle
    53:  Result := '霧雨';         // moderate Drizzle
    55:  Result := '強い霧雨';     // dense Drizzle
    56:  Result := '弱い着氷霧雨'; // Light Freezing Drizzle
    57:  Result := '強い着氷霧雨'; // dense Freezing Drizzle
    61:  Result := '弱い雨';       // Slight Rain
    63:  Result := '雨';           // moderate Rain
    65:  Result := '強い雨';       // heavy Rain
    66:  Result := '弱い凍雨';     // Light Freezing Rain
    67:  Result := '強い凍雨';     // heavy Freezing Rain
    71:  Result := '弱い雪';       // Slight Snow fall
    73:  Result := '雪';           // moderate Snow fall
    75:  Result := '強い雪';       // heavy Snow fall
    77:  Result := '霧雪';         // Snow grains
    80:  Result := '小雨';         // Slight Rain showers
    81:  Result := 'にわか雨';     // moderate Rain showers
    82:  Result := '強いにわか雨'; // violent Rain showers
    85:  Result := 'にわか雪';     // moderate Snow showers
    86:  Result := '強いにわか雪'; // heavy Snow showers
    95:  Result := '雷雨';         // Thunderstorm: Slight or moderate
    96:  Result := '雹を伴う雷雨'; // Thunderstorm with slight hail
    99:  Result := '雹を伴う雷雨'; // Thunderstorm with heavy hail
    else Result := 'エラー';
  end;
end;

 

実行確認

ここまで実装してプログラムを実行し、「天気取得」ボタン押すと、
取得されたこの先1週間分の天気が下図のように表示されます。

 
同様に様々なJSONが、Delphi 12 Athensでは
簡単にデータバインディングできるようになっています。ぜひ色々お試しください。

 

関連リンク

 

<Delphi/400 12 Athensの新機能>
第1回:IDEの新機能や機能拡張
第2回:Smart CodeInsightで生成AI連携
第3回:JSONバインディングウィザード(本記事)
第4回:4月公開予定!