Web 系アプリ開発のど素人が、チャレンジする WebAPI 連携日記の第 5 回です。
前回は気象庁の Web サイトから天気予報を取得するサンプルを紹介しました。ただ、テキストで表示するだけだと面白くないですよね。そこでお天気マークの表示にチャレンジしたいと思います。
利用するのは、天気コードです。
天気コードの定義
上記 JSON では 天気コードと天気のテキストがセットで提供されています。ですが、この天気コードは気象庁の Web サイトではマスタ化されているようです。
マスタデータをまるっと取得する URL は発見できなかったのですが、以下の Web ページに紹介されている手順で、JSON を取得できるようです。
気象庁JSON ファイルにある weatherCode 一覧
手順としては次の通りです。
- 天気予報の Web ページ を Chrome で開く
- デバッグツールを開く(F12)
- コンソールを開き ”Forecast.Const.TELOPS” と入力して、Enter を押す
- 出力された結果を右クリックして [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 件のコメント:
コメントを投稿