こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

Weather HacksのJSONを変換

こんにちは。「Javaを復習する初心者」です。今回は「Weather Hacks – livedoor 天気情報」からJSONを取得し、gsonというライブラリでJavaオブジェクトに変換してみました。ただし、変換先のjavaファイルは自作です。記事の内容はこのjavaファイルをどうやって作っていったかという話です。

JSONの説明

JSONとはJavaScript Object Notationの略でデータの表記法のひとつです。例えばJavaでint型配列の初期化に{1, 2, 3}などと書く文法がありますが、そのような記法を発展させたようなものです。JSONの細かい説明は今のところ省きます。一番単純な例は以下です。

{ "キー": 値 }

クラスを作る

以下のページに「お天気Webサービス仕様」が載っています。

第三者向け気象データ提供サービス「Weather Hacks」。Webサービス(Livedoor Weather Web Service / LWWS)とRSSフィード(RSS2.0)を中心としたデータを提供しています。

「リクエストパラメータ」と「レスポンスフィールド」という項目に定義が記載してあります。定義に従ったリクエストを送るとJSON形式で情報が返却されます。

「レスポンスフィールド」のJSONデータサンプルを見て、javaファイルを作っていきました。JSONデータの一番上の方に注目します。

{
   "publicTime" : "2013-01-29T11:00:00+0900",
   "title" : "福岡県 久留米 の天気",
	・
	・
	・
}

キーと値のペアがカンマで区切られています。これを変換用のJavaファイルに直すと例えば以下になります。

public class WeatherHacks {

    public String publicTime;
    public String title;

}

上記のようにJavaのクラスにString型変数を定義し、キーを変数名に記述していくという作業になるのですが、単純な構造ではないので工夫が必要です。次の箇所はdescriptionというキーですが、「description」に対して、キーとデータのペアが対応しています。

{
	・
	・
	・
   "description" : {
      "text" : " 九州北部地方は、高気圧に覆われて晴れています。\n\n 29日は、九州北部地方では、高気圧に覆われて晴れますが、気圧の谷の\n影響で、昼過ぎから次第に曇りとなるでしょう。\n\n 30日は、気圧の谷の影響ではじめ曇りますが、昼頃からは高気圧に覆わ\nれて概ね晴れるでしょう。\n\n 波の高さは、九州北部地方の沿岸の海域では、29日は1.5メートル、\n30日は1メートルでしょう。豊後水道では、29日と30日は1メートル\nでしょう。\n 福岡県の内海では、29日と30日は0.5メートルでしょう。",
      "publicTime" : "2013-01-29T10:37:00+0900"
   },
	・
	・
	・
}

descriptionというキーに対応するデータがさらにキーとデータのペアを持っています。なので新しくDescriptionクラスを作成します。

public class Description {

    public String text;
    public String publicTime;

}

WeatherHacksクラスにはDescription型変数を定義します。変数名はキー名と一致させます。

public class WeatherHacks {

    public String publicTime;
    public String title;
    public Description description;

}

上記のようにキーに対応するデータが中括弧で囲まれていた場合、適宜クラスを作っていきます。

以下の箇所は鍵括弧で囲まれています。これは配列です。

{
	・
	・
	・
   "pinpointLocations" : [
      {
         "link" : "http://weather.livedoor.com/area/forecast/4020200",
         "name" : "大牟田市"
      },
	・
	・
	・
}

なのでWeatherHacksクラスに定義する変数も以下のように配列にします。

package weather_hacks_json;

import weather_hacks_json.child.Description;
import weather_hacks_json.child.Forecasts;
import weather_hacks_json.child.Location;
import weather_hacks_json.child.PinpointLocations;
import weather_hacks_json.child.child.Copyright;

public class WeatherHacks {

	・
	・
	・
    public Forecasts[] forecasts;
	・
	・
	・

}

GitHubで公開中

作ったjavaファイルは以下のGitHubで公開しています。

class-for-weather-hacks-json - weather hacksのJSONデータを受け取るためのオブジェクト

例えばgsonライブラリでWeatherHacksクラスのインスタンスに値を格納することができます。String型変数jsonにJSON文字列が格納されている場合、次のように記述することでWeatherHacksクラスに変換ができます。

        WeatherHacks weatherHacks = new Gson().fromJson(json, WeatherHacks.class);

上記にtestパッケージのTest.javaが格納してあり、これで動作確認ができます。東京の天気を取得するテストです。gsonライブラリを使って、JSONをJavaのオブジェクトに変換しています。さらにそれをJSON形式のテキストに直し、コンソール出力をさせています。