こんにちは。「Javaを復習する初心者」です。
今回は「Weather Hacks – livedoor 天気情報」からJSONを取得し、gsonというライブラリでJavaオブジェクトに変換してみました。ただし、変換先のjavaファイルは自作です。記事の内容はこのjavaファイルをどうやって作っていったかという話です。
JSONの説明
JSONとはJavaScript Object Notationの略でデータの表記法のひとつです。例えばJavaでint型配列の初期化に{1, 2, 3}などと書く文法がありますが、そのような記法を発展させたようなものです。JSONの細かい説明は今のところ省きます。一番単純な例は以下です。
キーと値
{ "キー": 値 }
クラスを作る
以下のページに「お天気Webサービス仕様」が載っています。
http://weather.livedoor.com/weather_hacks/webservice
「リクエストパラメータ」と「レスポンスフィールド」という項目に定義が記載してあります。定義に従ったリクエストを送るとJSON形式で情報が返却されます。
「レスポンスフィールド」のJSONデータサンプルを見て、javaファイルを作っていきました。JSONデータの一番上の方に注目します。
JSONデータサンプル抜粋
{
"publicTime" : "2013-01-29T11:00:00+0900",
"title" : "福岡県 久留米 の天気",
・
・
・
}
キーと値のペアがカンマで区切られています。これを変換用のJavaファイルに直すと例えば以下になります。
WeatherHacks.java
public class WeatherHacks {
public String publicTime;
public String title;
}
上記のようにJavaのクラスにString型変数を定義し、キーを変数名に記述していくという作業になるのですが、単純な構造ではないので工夫が必要です。次の箇所はdescriptionというキーですが、「description」に対して、キーとデータのペアが対応しています。
JSONデータサンプル抜粋
{
・
・
・
"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クラスを作成します。
Description.java
public class Description {
public String text;
public String publicTime;
}
WeatherHacksクラスにはDescription型変数を定義します。変数名はキー名と一致させます。
WeatherHacks.java
public class WeatherHacks {
public String publicTime;
public String title;
public Description description;
}
上記のようにキーに対応するデータが中括弧で囲まれていた場合、適宜クラスを作っていきます。
以下の箇所は鍵括弧で囲まれています。これは配列です。
JSONデータサンプル抜粋
{
・
・
・
"pinpointLocations" : [
{
"link" : "http://weather.livedoor.com/area/forecast/4020200",
"name" : "大牟田市"
},
・
・
・
}
なのでWeatherHacksクラスに定義する変数も以下のように配列にします。
WeatherHacks.java
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で公開しています。
https://github.com/java-beginner/class-for-weather-hacks-json
例えばgsonライブラリでWeatherHacksクラスのインスタンスに値を格納することができます。String型変数jsonにJSON文字列が格納されている場合、次のように記述することでWeatherHacksクラスに変換ができます。
変換サンプル
WeatherHacks weatherHacks = new Gson().fromJson(json, WeatherHacks.class);
上記にtestパッケージのTest.javaが格納してあり、これで動作確認ができます。東京の天気を取得するテストです。gsonライブラリを使って、JSONをJavaのオブジェクトに変換しています。さらにそれをJSON形式のテキストに直し、コンソール出力をさせています。