2023/12/14

つないでみよう:#5)天気コードマスタの作成

Web 系アプリ開発のど素人が、チャレンジする WebAPI 連携日記の第 5 回です。

前回は気象庁の Web サイトから天気予報を取得するサンプルを紹介しました。ただ、テキストで表示するだけだと面白くないですよね。そこでお天気マークの表示にチャレンジしたいと思います。

利用するのは、天気コードです。


天気コードの定義

上記 JSON では 天気コードと天気のテキストがセットで提供されています。ですが、この天気コードは気象庁の Web サイトではマスタ化されているようです。

マスタデータをまるっと取得する URL は発見できなかったのですが、以下の Web ページに紹介されている手順で、JSON を取得できるようです。

気象庁JSON ファイルにある weatherCode 一覧

手順としては次の通りです。

  1. 天気予報の Web ページ を Chrome で開く
  2. デバッグツールを開く(F12)
  3. コンソールを開き ”Forecast.Const.TELOPS” と入力して、Enter を押す
  4. 出力された結果を右クリックして [object をコピー] を選択

これをメモ帳などに貼り付けると天気コードが JSON 形式で確認できます。この情報から天気コードと名称(日英)、アイコンの画像ファイル名(.svg)が確認できます。

{
   "100": [
      "100.svg",
      "500.svg",
      "100",
      "晴",
      "CLEAR"
   ],
   "101": [
      "101.svg",
      "501.svg",
      "100",
      "晴時々曇",
    ・・・


天気コードマスタの作成

では、この JSON から nsf 内に天気マスタを作成しましょう。

まずは、JSON を入力する画面を作成します。手順をすぐに忘れちゃうので、取得手順を含めて画面を作成してみました。

実行すると以下のように手順や URL リンク、Console に入力するコマンドが表示されます。これを利用して JSON を取得して、入力欄に貼りつけるという算段です。

作成処理が完了すると天気コードマスタが作成されます。

参考までですが、マスタフォームの設計は次のような感じです。


サンプルコード

実際にマスタを一括登録するためのエージェントを作成します。

まずはメインルーチンです。ここでは、初期設定とダイアログボックスを表示して、入力した JSON を取得、天気マスタを作成する関数 xCreateAllWeather をコールしています。

Option Declare
Private xns As NotesSession
Private xasFld(5) As String

Sub Initialize
   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim nd As NotesDocument
   Dim ndb As NotesDatabase
   Dim nv As NotesView

   Dim sJSON As String
   Dim iCount As Integer

   'フィールド名の定義
   xasFld(0) = "WeatherCode"
   xasFld(1) = "WeatherFileName"
   xasFld(2) = "WeatherFileName2"
   xasFld(3) = "WeatherGroup"
   xasFld(4) = "WeatherName"
   xasFld(5) = "WeatherNameEN"

   Set xns = New NotesSession
   Set ndb = xns.CurrentDatabase
   Set nuid = nuiw.CurrentDocument
   Set nd = ndb.CreateDocument()

   'JSON の入力
   If nuiw.Dialogbox("dlgInputWeatherMst", True, True, False, False, False, False, "天気マスタ登録", nd, True) Then
      'JSON の取得
      sJSON = nd.JSON(0)

      'JSON を解析してマスタを作成
      iCount = xCreateAllWeather(ndb, sJSON)

      'ビュー更新
      Call nuiw.ViewRefresh()

      MsgBox CStr(iCount) & " 件の天気マスタを登録しました。"
   End If
End Sub


天気マスタを作成する関数 xCreateAllWeather では、JSON から天気コード1件分のオブジェクトを取得して、マスタ文書を作成する関数 xCreateWeather をコールしています。

Function xCreateAllWeather(vndb As NotesDatabase, ByVal vsJSON As String) As Integer
   Dim jnav As NotesJSONNavigator
   Dim jelm As NotesJSONElement
   Dim i As Integer

   '天気コードを1件ごとに取得
   Set jnav = xns.CreateJSONNavigator(vsJSON)
   Set jelm = jnav.GetFirstElement()
   While Not (jelm Is Nothing)
      If xCreateWeather(vndb, jelm) Then i = i + 1
      Set jelm = jnav.GetNextElement()
   Wend

   xCreateAllWeather = i
End Function


xCreateWeather 関数では、実際にマスタ文書を作成しています。今回の JSON の構造では、天気名称などの詳細な情報は配列として保存されていました。そこで、ループを利用してセットする単純な構造となっています。

Function xCreateWeather(vndb As NotesDatabase, vjelm As NotesJSONElement) As Boolean
   Dim jelm As NotesJSONElement
   Dim jarr As NotesJSONArray
   Dim jobj As NotesJSONObject
   Dim nd As NotesDocument
   Dim i As Integer

   xCreateWeather = False
   If vjelm.Type <> Jsonelem_type_array Then Exit Function

   'マスタ文書作成
   Set nd = vndb.CreateDocument()
   nd.Form = "fWeather"

   'コードをフィールドにセット
   Call nd.ReplaceItemValue(xasFld(0), vjelm.Name)

   '配列内の各要素をフィールドにセット
   Set jarr = vjelm.Value
   For i = 1 To jarr.Size
      Set jelm = jarr.GetNthElement(i)
      Call nd.ReplaceItemValue(xasFld(i), jelm.Value)
   Next

   xCreateWeather = nd.Save(True, False)
End Function


前回 連載:つないでみよう 次回

0 件のコメント:

コメントを投稿